java - 无法添加到布局约束必须是 gridbagconstraint

标签 java swing layout-manager gridbaglayout border-layout

我需要使用 GridBagLayout 但出现以下错误。你能帮忙吗?

java.lang.IllegalArgumentException: cannot add to layout: constraints must be a GridBagConstraint at java.awt.GridBagLayout.addLayoutComponent(Unknown Source) at java.awt.Container.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at havuzAracıFormu.(havuzAracıFormu.java:221) at havuzAracıFormu$1.run(havuzAracıFormu.java:47) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import org.jdatepicker.impl.JDatePanelImpl;
import org.jdatepicker.impl.JDatePickerImpl;
import org.jdatepicker.impl.UtilDateModel;

import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JFormattedTextField.AbstractFormatter;

import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Properties;
import java.awt.event.ActionEvent;

public class havuzAracıFormu extends JFrame {

    private JPanel contentPane;
    private JTextField textFieldAdSoyad;
    private JTextField textFieldGorev;
    private JTextField textFieldDepartman;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    havuzAracıFormu frame = new havuzAracıFormu();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     * @throws ClassNotFoundException 
     * @throws SQLException 
     */
    public havuzAracıFormu() throws ClassNotFoundException, SQLException {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 728, 992);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.CENTER;

        setContentPane(contentPane);

        JLabel lblKullancBilgileri = new JLabel("Kullan\u0131c\u0131 Bilgileri");
        Font font = lblKullancBilgileri.getFont();
        lblKullancBilgileri.setFont(new Font(font.getFontName(), Font.BOLD, 14));
        contentPane.add(lblKullancBilgileri);       

        JLabel lblAdSoyad = new JLabel("Ad\u0131 Soyad\u0131");
        JLabel lblGorevi = new JLabel("Görevi");
        JLabel lblDepartmani = new JLabel("Departman\u0131");
        contentPane.add(lblAdSoyad,gbc);

        textFieldAdSoyad = new JTextField();
        contentPane.add(textFieldAdSoyad, gbc);
        textFieldAdSoyad.setColumns(10);

        contentPane.add(lblGorevi);

        textFieldGorev = new JTextField();
        contentPane.add(textFieldGorev, gbc);
        textFieldGorev.setColumns(5);

        contentPane.add(lblDepartmani, gbc);

        textFieldDepartman = new JTextField();
        contentPane.add(textFieldDepartman);
        textFieldDepartman.setColumns(10);


        JLabel lblAracBilgileri = new JLabel("Araç Bilgileri");
        Font font2 = lblAracBilgileri.getFont();
        lblAracBilgileri.setFont(new Font(font2.getFontName(), Font.BOLD, 14));
        contentPane.add(lblAracBilgileri, gbc);

        JLabel lblMarka = new JLabel("Marka");
        contentPane.add(lblMarka, gbc);
        JTextField textFieldMarka = new JTextField(5);
        contentPane.add(textFieldMarka,gbc);
        textFieldMarka.setColumns(5);

        JLabel lblModel = new JLabel("Model");
        contentPane.add(lblModel,gbc);
        JTextField textFieldModel = new JTextField();
        contentPane.add(textFieldModel,gbc);
        textFieldModel.setColumns(5);

        JLabel lblPlakaNo = new JLabel("PlakaNo");
        contentPane.add(lblPlakaNo,gbc);
        JTextField textFieldPlakaNo = new JTextField();
        contentPane.add(textFieldPlakaNo,gbc);
        textFieldPlakaNo.setColumns(5);

        JLabel lblCikisTarihiveSaati = new JLabel("Çıkış Tarihi ve Saati");
        contentPane.add(lblCikisTarihiveSaati,gbc);
        JTextField textFieldCikis = new JTextField();
//      contentPane.add(textFieldCikis);
        UtilDateModel model = new UtilDateModel();
        Properties p = new Properties();
        p.put("text.today", "Today");
        p.put("text.month", "Month");
        p.put("text.year", "Year");
        JDatePanelImpl datePanel = new JDatePanelImpl(model, p);
        JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new DateLabelFormatter());
        contentPane.add(datePicker,gbc);

        textFieldCikis.setColumns(5);

        JLabel lblCikisKm = new JLabel("Çıkış Km");
        contentPane.add(lblCikisKm,gbc);
        JTextField textFieldCikisKm = new JTextField();
        contentPane.add(textFieldCikisKm,gbc);
        textFieldCikisKm.setColumns(5);

        JLabel lblDonusTarihiveSaati = new JLabel("Dönüş Tarihi ve Saati");
        contentPane.add(lblDonusTarihiveSaati,gbc);
        JTextField textFieldDonus = new JTextField();
        UtilDateModel model2 = new UtilDateModel();
        Properties p2 = new Properties();
        p2.put("text.today", "Today");
        p2.put("text.month", "Month");
        p2.put("text.year", "Year");
        JDatePanelImpl datePanel2 = new JDatePanelImpl(model2, p);

        JDatePickerImpl datePicker2 = new JDatePickerImpl(datePanel2, new DateLabelFormatter());
        contentPane.add(datePicker2,gbc);
        textFieldDonus.setColumns(5);

        JLabel lblDonusKm = new JLabel("Dönüş Km");
        contentPane.add(lblDonusKm,gbc);
        JTextField textFieldDonusKm = new JTextField();
        contentPane.add(textFieldDonusKm,gbc);
        textFieldDonusKm.setColumns(5);

        JLabel lblNeden = new JLabel("Aracın Kullanılacağı Yer-Kullanım Neden Geçici Araç");
        contentPane.add(lblNeden,gbc);
        JTextField textFieldNeden = new JTextField();
        contentPane.add(textFieldNeden,gbc);
        textFieldNeden.setColumns(5);

        JLabel lblKullanimSuresi = new JLabel("Kullanım Süresi");
        contentPane.add(lblKullanimSuresi,gbc);
        JTextField textFieldSure = new JTextField();
        contentPane.add(textFieldSure,gbc);
        textFieldSure.setColumns(5);

        JLabel lblHasarveEksiklikler = new JLabel("Hasar ve Eksiklikler");
        contentPane.add(lblHasarveEksiklikler,gbc);

        JLabel lblAractaGorulenHasarlar = new JLabel("Araçta Görülen Hasarlar veya Eksiklikler (Zincir, İstetme, İlk Yardım Çantası vs.");
        contentPane.add(lblAractaGorulenHasarlar,gbc);

        JTextField textFieldHasar = new JTextField();
        contentPane.add(textFieldHasar,gbc);
        textFieldHasar.setColumns(5);

        JButton btnNewButton = new JButton("Gönder");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String url = "jdbc:sqlserver://WIN-J53H5BK2ANC;databaseName=test;integratedSecurity=true;";
                try {
                    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

                Connection conn = DriverManager.getConnection(url);
                Statement st = conn.createStatement();
                String queryString = "insert into havuzAracıFormu values ('" + textFieldAdSoyad.getText() + "'," + 
                                                                          "'" + textFieldGorev.getText() + "'," +
                                                                          "'" + textFieldDepartman.getText() + "'," +
                                                                          "'" + textFieldMarka.getText() + "'," +
                                                                          "'" + textFieldModel.getText() + "'," +
                                                                          "'" + textFieldPlakaNo.getText() + "'," +
                                                                          "'" + datePicker.getJFormattedTextField().getText() + "'," +
                                                                          "'" + textFieldCikisKm.getText() + "'," +
                                                                          "'" + datePicker2.getJFormattedTextField().getText()+ "'," +
                                                                          "'" + textFieldDonusKm.getText() + "'," +
                                                                          "'" + textFieldNeden.getText() + "'," +
                                                                          "'" + textFieldSure.getText() + "'," +
                                                                          "'" + textFieldHasar.getText() + "')";
                st.executeUpdate(queryString);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        contentPane.add(btnNewButton, BorderLayout.SOUTH);
    }

}

class DateLabelFormatter extends AbstractFormatter{

    private String datePattern = "yyyy-MM-dd";
    private SimpleDateFormat dateFormatter = new SimpleDateFormat(datePattern);

    @Override
    public Object stringToValue(String text) throws ParseException {

        return dateFormatter.parseObject(text);
    }

    @Override
    public String valueToString(Object value) throws ParseException {
        if(value != null){
            Calendar cal = (Calendar) value;
            return dateFormatter.format(cal.getTime());
        }
        return "";
    }

}

最佳答案

一旦该代码形成一种更简单的形式,可以在没有所有麻烦的情况下进行编译,与自定义(即您的)代码相关的堆栈跟踪的第一行是:

contentPane.add(btnNewButton, BorderLayout.SOUTH);

BorderLayout.SOUTH 是一个针对 BorderLayout 的约束,但我们在代码的前面看到..

contentPane.setLayout(new GridBagLayout()); // I.E. **NOT** a BorderLayout

一般建议

  • 参见What is a stack trace, and how can I use it to debug my application errors?作为程序员,我们在整个职业生涯中会遇到很多异常,我们需要学习如何解决它们,或者至少是其中的大多数。只有当您知道如何解决大多数异常但不确定为什么特定代码行中会发生特定异常时,您才应该询问。
  • 正如一些人在评论中提到的,当有疑问时,简化代码直到显示错误,但删除所有不相关的代码。
  • 我研究这个的唯一原因是因为我特别无聊而且睡不着。我通常会投票结束并继续处理下一个问题,该人可以设法创建 MCVE。所以..将来不要指望有人会怜悯你。

关于java - 无法添加到布局约束必须是 gridbagconstraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40527463/

相关文章:

java - LinkedHashSet 按降序排列元素?

java - 如何在jsp上显示服务器生成的Jfreechart图像

java - JTable 中的单元格 setBorder 更改附近单元格背景

java - 在 Java GUI 中显示鼠标所在位置键入的字符

java - 在半透明 Swing 窗口内创建 jtable

java - 调用 Java Swing 程序的最佳实践

java - 有没有一个很好的独立的、轻量级的、基于 GUI 的 mac Java 调试工具?

java - 什么布局接受百分比而不是 Swing 中的值?

java - 如何获得这个Java布局?

java - 我有一个 JApplet,它必须显示 3 个组件。 (2 个 JPanel 和 1 个 Paint 方法)