无法正确显示Java GUI布局

时间:2012-10-24 00:55:12

标签: java swing layout awt layout-manager

我正在处理这个应用程序,我无法让GUI正常显示。我正在使用FlowLayout,一切看起来都混乱(任何其他布局看起来更糟)。如果只是某种方式在各个部分之间添加一个水平规则,那就行了,但我尝试过的任何工作都没有。

这是我的代码:

import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;


public class ConnectToDB implements ActionListener {
    public static void main(String[] args){

        //GUI STUFF
        //constants
        final int windowX = 640; //pixels
        final int windowY = 655; //pixels
        final int fieldX = 20;   //characters
        final FlowLayout LAYOUT_STYLE = new FlowLayout();

        //window
        JFrame window = new JFrame("Mike's MySQL GUI Client");

        //Connection Details
        JLabel enterInfo = new JLabel("Enter Connection Details: ");
        JLabel driver = new JLabel("Database Driver: ");
        JTextField driverText = new JTextField(fieldX);
        JLabel dburl = new JLabel("Database URL: ");
        JTextField dburlText = new JTextField(fieldX);
        JLabel dbuser = new JLabel("Username: ");
        JTextField dbuserText = new JTextField(fieldX);
        JLabel dbpass = new JLabel("Password: ");
        JTextField dbpassText = new JTextField(fieldX);

        //Enter a SQL Command
        JLabel enterSQL = new JLabel("Enter a SQL Command:");
        JTextArea enterSQLText = new JTextArea(10, 30);

        //Connection Status and Command Buttons
        JLabel connectionStatus = new JLabel ("No Connection Now");
        JButton connectButton = new JButton("Connect");
        JButton executeButton = new JButton("Execute SQL Command");
        JButton clearCommandButton = new JButton("Clear Command");

        //SQL Execution Result
        JLabel executionResult = new JLabel("SQL Execution Result:");
        JButton clearResultsButton = new JButton("Clear Results");
        JTextArea executionResultText = new JTextArea(20, 50);

        //Configure GUI
        window.setSize(windowX, windowY);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        driverText.setEditable(false);
        dburlText.setEditable(false);
        dbuserText.setEditable(false);
        dbpassText.setEditable(false);
        executionResultText.setEditable(false);

        //Register Event Listeners
        connectButton.addActionListener(null);
        executeButton.addActionListener(null);
        clearCommandButton.addActionListener(null);
        clearResultsButton.addActionListener(null);

        //Construct Container
        Container c = window.getContentPane();

        c.setLayout(LAYOUT_STYLE);

        c.add(enterInfo);
        c.add(driver);
        c.add(driverText);
        c.add(dburl);
        c.add(dburlText);
        c.add(dbuser);
        c.add(dbuserText);
        c.add(dbpass);
        c.add(dbpassText);
        c.add(connectionStatus);
        c.add(connectButton);
        c.add(enterSQL);
        c.add(enterSQLText);
        c.add(executeButton);
        c.add(clearCommandButton);
        c.add(new JSeparator(SwingConstants.VERTICAL));
        c.add(executionResult);
        c.add(clearResultsButton);
        c.add(executionResultText);

        window.setVisible(true);//END GUI STUFF

        //DB Connection details
        System.out.println("Attempting to connect to database...");
        Connection conn = null;
        String url = "jdbc:mysql://localhost/";
        String dbName = "project3";
        String DBdriver = "com.mysql.jdbc.Driver";
        String userName = "root"; 
        String password = "OMGnpw=-0";

        driverText.setText(DBdriver);
        dburlText.setText(url);
        dbuserText.setText(userName);
        dbpassText.setText(password);

        try 
        {
          //Connect to DB and notify user
          Class.forName(DBdriver).newInstance();
          conn = DriverManager.getConnection(url+dbName,userName,password);
          System.out.println("Connected to the database");

          /*>>>>>>Do everything you need to do while connected to DB<<<<<<*/

          //HOW TO EXECUTE A STATEMENT AND PRINT IT
          //Create a statement
          Statement statement = conn.createStatement();
          //Execute a statement
          ResultSet resultSet = statement.executeQuery("SELECT * FROM riders");
          //Process query results
          ResultSetMetaData metaData = resultSet.getMetaData();
          int numberOfColumns = metaData.getColumnCount();

          for(int i = 1; i<= numberOfColumns; i++){
              System.out.printf("%20s\t", metaData.getColumnName(i));
          }
          System.out.println();

          while (resultSet.next()){
              for (int i = 1; i <= numberOfColumns; i++){
                  System.out.printf("%20s\t", resultSet.getObject(i));
              }
              System.out.println();
          }
          /*>>>>>>Finish DB activities<<<<<<*/

          //Disconnect from DB
          conn.close(); 
          System.out.printf("Disconnected from database");
        } 
        catch (Exception e) {
        e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e){
        System.out.println("Button Works!");
    }
}

我可能需要使用不同的布局,但FlowLayout是我唯一熟悉的。有人可以建议一个简单的解决方法吗?

2 个答案:

答案 0 :(得分:2)

尝试使用方框布局。并添加一些面板。使面板流动布局并在每个面板中放置一对标签和文本域

|-----container with box layout-----|
panel[[flow]label texfield] 
panel[[flow]label texfield] 
panel[[flow]label texfield] 
panel[[flow]label texfield] 
panel[[flow]label texfield] 
panel[[flow]sqltextfields] 
panel[[flow]buttons] 
|-----------------------------------|

并且在底部附近放置了sql文本字段和按钮

http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html

答案 1 :(得分:1)

所以,我们一点点玩你就可以实现这个......

这使用卡片布局,边框布局,网格包布局和流程布局的组合

连接窗格......

enter image description here

查询窗格

enter image description here

public class TestLayout11 {

    public static void main(String[] args) {
        new TestLayout11();
    }

    public TestLayout11() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new SQLPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class SQLPane extends JPanel {

        private ConnectionPane connectionPane;
        private QueryPane queryPane;

        public SQLPane() {

            setLayout(new CardLayout(8, 8));

            connectionPane = new ConnectionPane();
            connectionPane.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    // Perform login...
                    ((CardLayout) getLayout()).show(SQLPane.this, "query");

                }
            });
            queryPane = new QueryPane();

            add(connectionPane, "connection");
            add(queryPane, "query");

            ((CardLayout) getLayout()).show(this, "connection");

        }
    }

    public static class ConnectionPane extends JPanel {

        protected static final int FIELD_CHARACTER_WIDTH = 20;   //characters
        private JButton connectButton;
        private JTextField driverText;
        private JTextField dburlText;
        private JTextField dbuserText;
        private JTextField dbpassText;

        public ConnectionPane() {

            JLabel enterInfo = new JLabel("Enter Connection Details: ");
            JLabel driver = new JLabel("Database Driver: ");
            driverText = new JTextField(FIELD_CHARACTER_WIDTH);
            JLabel dburl = new JLabel("Database URL: ");
            dburlText = new JTextField(FIELD_CHARACTER_WIDTH);
            JLabel dbuser = new JLabel("Username: ");
            dbuserText = new JTextField(FIELD_CHARACTER_WIDTH);
            JLabel dbpass = new JLabel("Password: ");
            dbpassText = new JTextField(FIELD_CHARACTER_WIDTH);

            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridwidth = 2;
            gbc.insets = new Insets(2, 2, 2, 2);
            add(enterInfo, gbc);
            gbc.anchor = GridBagConstraints.EAST;
            gbc.gridwidth = 1;
            gbc.gridy++;
            add(driver, gbc);
            gbc.gridy++;
            add(dburl, gbc);
            gbc.gridy++;
            add(dbuser, gbc);
            gbc.gridy++;
            add(dbpass, gbc);

            gbc.gridx++;
            gbc.gridy = 1;
            gbc.anchor = GridBagConstraints.WEST;
            add(driverText, gbc);
            gbc.gridy++;
            add(dburlText, gbc);
            gbc.gridy++;
            add(dbuserText, gbc);
            gbc.gridy++;
            add(dbpassText, gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.gridwidth = 2;
            connectButton = new JButton("Connect");
            add(connectButton, gbc);
        }

        public void addActionListener(ActionListener listener) {
            connectButton.addActionListener(listener);
        }

        public void removeActionListener(ActionListener listener) {
            connectButton.removeActionListener(listener);
        }
    }

    public static class QueryPane extends JPanel {

        private JTextArea enterSQLText;

        public QueryPane() {

            JLabel enterSQL = new JLabel("Enter a SQL Command:");
            enterSQLText = new JTextArea(10, 30);
            JButton clearResultsButton = new JButton("Clear Results");
            JButton executeButton = new JButton("Execute SQL Command");

            setLayout(new BorderLayout());

            add(enterSQL, BorderLayout.NORTH);
            add(new JScrollPane(enterSQLText));

            JPanel buttons = new JPanel();
            buttons.add(executeButton);
            buttons.add(clearResultsButton);
            add(buttons, BorderLayout.SOUTH);

            executeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Execute query...
                    String text = enterSQLText.getText();
                    enterSQLText.setText("I've being executed....");
                }
            });

            clearResultsButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    enterSQLText.setText(null);
                }
            });

        }
    }
}