2012-06-30 6 views
6

Được ngồi đây tại máy tính của tôi trong khoảng 13 giờ và tôi nghĩ rằng đôi mắt của tôi đang chảy máu. Tôi tìm thấy một biên tập viên gui nhỏ mà tôi thích gọi là GuiGenie. Nó hoạt động hoàn hảo để tạo cửa sổ bằng các nút và tất cả những thứ tốt đẹp đó. Vấn đề là tôi muốn bấm vào một nút trong menu đầu tiên của tôi và mở nó ra menu khác mà tôi đã tạo. Tôi mới bắt đầu lập trình cách đây 4 tuần vì vậy tôi là một người hoàn thành. Tôi có một cảm giác của nó rối tung lên vì các phương pháp chính nhưng tôi không có ý tưởng và 13 giờ ngồi đây cố gắng hàng triệu điều đang khiến tôi phát điên:) đây là những gì tôi có cho đến nayJava Mở một cửa sổ mới bằng cách nhấp vào một nút

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

public class MyPanel extends JPanel { 
private JTextField How; 
private JLabel jcomp2; 
private JLabel jcomp3; 
private JButton jcomp4; 

public MyPanel() { 
    //construct components 
    How = new JTextField (1); 
    jcomp2 = new JLabel ("How long were you parked?"); 
    jcomp3 = new JLabel ("Minutes"); 
    jcomp4 = new JButton ("openNewWindow"); 

    //adjust size and set layout 
    setPreferredSize (new Dimension (315, 85)); 
    setLayout (null); 

    //add components 
    add (How); 
    add (jcomp2); 
    add (jcomp3); 
    add (jcomp4); 

    //set component bounds (only needed by Absolute Positioning) 
    How.setBounds (245, 50, 60, 25); 
    jcomp2.setBounds (35, 30, 185, 50); 
    jcomp3.setBounds (250, 30, 60, 20); 
    jcomp4.setBounds (0, 0, 315, 25); 

     jcomp4.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 

     } 
    }); 
} 


public static void main (String[] args) { 
    JFrame frame = new JFrame ("MyPanel"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add (new MyPanel()); 
    frame.pack(); 
    frame.setVisible (true); 
} 
} 

Khi nhấn nút, tôi muốn mở nút này cửa sổ mới

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

public class MyPanel2 extends JPanel { 
private JButton jcomp1; 
private JButton jcomp2; 
private JButton jcomp3; 
private JTextField jcomp4; 

public MyPanel2() { 
    //construct components 
    jcomp1 = new JButton ("test1"); 
    jcomp2 = new JButton ("test2"); 
    jcomp3 = new JButton ("test3"); 
    jcomp4 = new JTextField (5); 

    //adjust size and set layout 
    setPreferredSize (new Dimension (395, 156)); 
    setLayout (null); 

    //add components 
    add (jcomp1); 
    add (jcomp2); 
    add (jcomp3); 
    add (jcomp4); 

    //set component bounds (only needed by Absolute Positioning) 
    jcomp1.setBounds (20, 45, 100, 25); 
    jcomp2.setBounds (135, 60, 100, 25); 
    jcomp3.setBounds (260, 35, 100, 25); 
    jcomp4.setBounds (105, 115, 100, 25); 
} 


public static void main (String[] args) { 
    JFrame frame = new JFrame ("MyPanel"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add (new MyPanel2()); 
    frame.pack(); 
    frame.setVisible (true); 
} 
} 

Nếu có ai có thể giúp tôi đánh giá cao điều đó !! Tôi có rất nhiều sự tôn trọng đối với các bạn, vì nếu bạn là một người chuyên nghiệp, bạn có thể thông minh hơn 99,9% thế giới. Công cụ này làm tổn thương não tôi.

+14

Dừng cố gắng điều ngẫu nhiên, nghỉ ngơi, ngủ một đêm ngon giấc, và sau đó đọc các hướng dẫn Swing: http : //docs.oracle.com/javase/tutorial/uiswing/. Hiểu rằng một JPanel phải được đặt trong một JFrame của JDialog được hiển thị trong một cửa sổ mới và bạn chỉ nên có một phương thức chính trong một ứng dụng. Bạn không cần hai. –

Trả lời

4

Đây là mã cho lớp myPanel, sử dụng cái này:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.*; 

public class MyPanel extends JPanel { 
private JTextField How; 
private JLabel jcomp2; 
private JLabel jcomp3; 
private JButton jcomp4; 

public MyPanel() { 
    //construct components 
    How = new JTextField (1); 
    jcomp2 = new JLabel ("How long were you parked?"); 
    jcomp3 = new JLabel ("Minutes"); 
    jcomp4 = new JButton ("openNewWindow"); 

    jcomp4.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      JFrame frame = new JFrame ("MyPanel"); 
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
      frame.getContentPane().add (new MyPanel2()); 
      frame.pack(); 
      frame.setVisible (true); 

     } 
    }); 

    //adjust size and set layout 
    setPreferredSize (new Dimension (315, 85)); 
    setLayout (null); 

    //add components 
    add (How); 
    add (jcomp2); 
    add (jcomp3); 
    add (jcomp4); 

    //set component bounds (only needed by Absolute Positioning) 
    How.setBounds (245, 50, 60, 25); 
    jcomp2.setBounds (35, 30, 185, 50); 
    jcomp3.setBounds (250, 30, 60, 20); 
    jcomp4.setBounds (0, 0, 315, 25); 

     jcomp4.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 

     } 
    }); 
} 


public static void main (String[] args) { 
    JFrame frame = new JFrame ("MyPanel"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add (new MyPanel()); 
    frame.pack(); 
    frame.setVisible (true); 
} 
} 
+0

+1, để thay thế khác :-) –

+4

Đối tượng GUI Swing phải được xây dựng và thao tác _only_ trên [chuỗi gửi sự kiện] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) . – trashgod

8

Dưới đây là một cái gì đó bạn có thể làm, cho tình huống này, nơi bạn có nhiều Forms or Windows những gì bạn có thể làm là sử dụng một JPanel mà có thể có điều này CardLayout thiết lập vì nó là LayoutManager và sau đó bạn có thể thêm hai JPanel s vào nó và truy cập chúng với các phương pháp được cung cấp bởi cùng.

Không sử dụng setBounds() khi sử dụng Absolute Positioning đây thực sự không phải là cách đúng để đưa thành phần vào vùng chứa chính. Thay vào đó, hãy sử dụng phương thức setLocation(...)setSize(...). Xem xét không sử dụng Định vị Tuyệt đối càng nhiều càng tốt cho bạn. Các dòng nhất định có lợi cho dòng trước đó được lấy từ Tài liệu Java như sau:

Mặc dù có thể thực hiện mà không cần trình quản lý bố cục, bạn nên sử dụng trình quản lý bố cục nếu có thể. Trình quản lý bố cục giúp dễ dàng hơn để điều chỉnh thành hiển thị thành phần phụ thuộc vào cảm nhận và cảm nhận, khác với kích thước phông chữ , kích thước thay đổi của vùng chứa và các miền địa phương khác nhau. Trình quản lý bố cục cũng có thể được tái sử dụng dễ dàng bởi các vùng chứa khác, cũng như các chương trình khác.

Vì đầu ra của chương trình của bạn thực sự không phải là trải nghiệm nhẹ nhàng theo bất kỳ ý nghĩa nào. Atleast LayoutManager, có thể làm cho công việc đó dễ dàng hơn rất nhiều cho bạn, vì bạn không cần phải xác định vị trí và kích thước cho mỗi thành phần. Hãy thử đi qua số Layout Mangers Tutorials và làm quen với chúng càng sớm càng tốt. Họ là những người tiết kiệm cuộc sống thực :-)

Dưới đây là một mã sửa đổi lấy từ bạn SOURCE CODE

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

public class CardLayoutExample 
{ 
    private JPanel contentPane; 
    private MyPanel panel1; 
    private MyPanel2 panel2; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Card Layout Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setBorder(
      BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new CardLayout()); 
     panel1 = new MyPanel(contentPane); 
     panel2 = new MyPanel2(); 
     contentPane.add(panel1, "Panel 1"); 
     contentPane.add(panel2, "Panel 2"); 
     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new CardLayoutExample().displayGUI(); 
      } 
     }); 
    } 
} 

class MyPanel extends JPanel { 

    private JTextField How; 
    private JLabel jcomp2; 
    private JLabel jcomp3; 
    private JButton jcomp4; 
    private JPanel contentPane; 

    public MyPanel(JPanel panel) { 

     contentPane = panel; 
     //construct components 
     How = new JTextField (1); 
     jcomp2 = new JLabel ("How long were you parked?"); 
     jcomp3 = new JLabel ("Minutes"); 
     jcomp4 = new JButton ("openNewWindow"); 

     //adjust size and set layout 
     setPreferredSize (new Dimension (315, 85)); 
     setLayout (null); 

     //set component bounds (only needed by Absolute Positioning) 
     How.setBounds (245, 50, 60, 25); 
     jcomp2.setBounds (35, 30, 185, 50); 
     jcomp3.setBounds (250, 30, 60, 20); 
     jcomp4.setLocation(0, 0); 
     jcomp4.setSize(315, 25); 
     jcomp4.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       CardLayout cardLayout = (CardLayout) contentPane.getLayout(); 
       cardLayout.next(contentPane); 
      } 
     }); 

     //add components 
     add (How); 
     add (jcomp2); 
     add (jcomp3); 
     add (jcomp4);    
    } 
} 

class MyPanel2 extends JPanel { 
    private JButton jcomp1; 
    private JButton jcomp2; 
    private JButton jcomp3; 
    private JTextField jcomp4; 

    public MyPanel2() { 
     //construct components 
     jcomp1 = new JButton ("test1"); 
     jcomp2 = new JButton ("test2"); 
     jcomp3 = new JButton ("test3"); 
     jcomp4 = new JTextField (5); 

     //adjust size and set layout 
     setPreferredSize (new Dimension (395, 156)); 
     setLayout (null); 

     //set component bounds (only needed by Absolute Positioning) 
     jcomp1.setBounds (20, 45, 100, 25); 
     jcomp2.setBounds (135, 60, 100, 25); 
     jcomp3.setBounds (260, 35, 100, 25); 
     jcomp4.setBounds (105, 115, 100, 25); 

     //add components 
     add (jcomp1); 
     add (jcomp2); 
     add (jcomp3); 
     add (jcomp4);  
    } 
} 
+2

Ví dụ hữu ích, nhưng bạn nên hướng dẫn OP _away_ sử dụng bố cục 'null'. :-) – trashgod

+1

Xong và Thankx lần nữa để chỉ ra :-) –