2012-10-24 3 views
0

이 응용 프로그램에서 작업 중이며 제대로 표시되도록 GUI를 가져올 수 없습니다. 나는 FlowLayout을 사용하고 있으며, 모든 것은 뒤죽박죽이되어 보인다. (다른 레이아웃은 더 나빠 보인다.) 섹션 사이에 수평선을 추가하는 방법이 있다면 작동하지만 아무 것도 시도하지 않았습니다.Java GUI 레이아웃을 올바르게 표시 할 수 없음

여기 내 코드입니다 : 내가 다른 레이아웃을 사용해야 할 수도

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에 내가 잘 알고 있어요 유일한 하나입니다. 누구든지 쉬운 수정을 제안 할 수 있습니까?

+0

이 질문에 추가하려면 나는 또한 내 버튼 내 액션 이벤트 리스너에 문제가 있어요. .addActionEventListener (this)와 같은 것을하면; 그런 다음 오류가 발생하지만, .addActionEventListener (null); 그러면 전혀 작동하지 않습니다. 내가 제대로 작동하게하려면 무엇을 사용해야합니까? – PeerPressure

+2

* 누구나 쉬운 해결 방법을 제안 할 수 있습니까? [레이아웃 관리자 사용] (http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html)을 통해 읽기를 시도 했습니까? – MadProgrammer

+0

다음은 제안 사항입니다. 전체 UI를 단일 창에 쏟아 내지 말고 기능을 논리적 그룹으로 분리하십시오. – MadProgrammer

답변

2

상자 레이아웃을 사용해보십시오. 그리고 그것에 몇 개의 패널을 추가하십시오. 우리가 조금 연주 주위

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

+0

굉장! 그게 레이아웃을 위해 일 했어. 고마워. 누군가가 버튼 청취자 문제에 대해 밝힐 수 있습니까? 그것이 내가 가지고있는 마지막 문제입니다. – PeerPressure

+0

ConnectToDB의 인스턴스를 아직 만들지 않았으므로 주 작업자입니다. 이 코드는 모두 생성자에 있어야합니다. 그렇다면 그것은 무엇인지 '이'가 – case1352

+0

고맙습니다! – PeerPressure

1

그래서 당신의 SQL 텍스트 필드 나 버튼을 넣어 패널 흐름 레이아웃을 확인하고 각 패널

|-----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] 
|-----------------------------------| 

과 하단에 라벨과 텍스트 필드의 한 쌍을 넣어 이것을 실현할 수 있습니다 ...

이것은 카드 레이아웃, 테두리 레이아웃, 그리드 백 레이아웃 및 흐름 레이아웃의 조합을 사용합니다.

연결 창 ...

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); 
       } 
      }); 

     } 
    } 
} 
관련 문제