簡體   English   中英

將面板從方法添加到框架

[英]Adding a panel from a method to a frame

我真的不知道該怎么說,但實際上:

-我有幾個單獨的“零件”,試圖添加到主框架上; 為了避免代碼變得笨拙,我讓每個“片斷”都成為自己的類。

-我被困在將面板添加到主框架上,因為類本身不是面板,而是由類的方法創建面板,這會產生我不知道如何解決的問題。

PIECE(當我創建對話框而不是面板時可以單獨工作):

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


public class PieceThing3 extends JPanel //<switched from JDialog
{
    //set up variables here


private ActionListener pieceAction = new ActionListener()
{
    public void actionPerformed (ActionEvent ae)
    {
        // Action Listener (this also works)
    }
};

private void createPiece()
{
    //setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    //setLocationByPlatform(true);
    // the above are commented out when I switch from dialog to panel

    JPanel contentPane = new JPanel();

    //something that uses pieceAction is here

    //two buttons, b and s, with action listeners are here

    contentPane.add(b);
    contentPane.add(s);
    add(contentPane);
    //pack();
       //again, commented out to switch from dialog
    setVisible(true);
    System.out.println("hi I'm done");
      //just to check and make sure it's done
}

public static void main(String[] args) 
{
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            new PieceThing3().createPiece();
        }
    });
}
}

抱歉,這很模糊,但是復雜性並不像一般想法那么重要-當我創建自己的對話框時,它可以完美地工作,但是現在我試圖在主代碼中創建一個面板,如下所示:

主:

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

public class CollectGUI extends JFrame{


private void createDialog(){
    this.setSize(2000,1000);
    this.setLocation(0,0);
    this.setTitle("TITLE");


    PieceThing3 pt = new PieceThing3();
    //HERE, if I do pt.main(null); while it is in "dialog mode" (rather than panel) it pops up a dialog box and everything is hunky dory. But I don't know how to get it to add the method as a panel.

   this.add(pt.main(null));
   //this gives an error

   this.setVisible(true);
}


public static void main(String[] args) {
    // TODO Auto-generated method stub
    new CollectGUI().createDialog();
}

}

正如我在評論中所說,如果將pt設置為創建對話框時,我只是執行pt.main(null),但這樣做,但是如果我嘗試將pt.main(null)添加為面板,則會拋出錯誤。 有人可以給我一些關於如何添加類而不是類的方法的見解嗎? 我很沮喪。

謝謝!!

您肯定在正確的軌道上進行工作,以保持關注點分離並在許多不同的組件中實現gui。 嘗試這樣的事情:

小組1

import javax.swing.JLabel;
import javax.swing.JPanel;

public class Panel1 extends JPanel {

    public Panel1() {
        this.add(new JLabel("This is panel 1"));
    }

}

面板2

import javax.swing.JLabel;
import javax.swing.JPanel;

public class Panel2 extends JPanel {

    public Panel2() {
        this.add(new JLabel("This is panel 2"));
    }

}

J框架

import java.awt.BorderLayout;

import javax.swing.JFrame;

import org.yaorma.example.jframe.panel.panel1.Panel1;
import org.yaorma.example.jframe.panel.panel2.Panel2;

public class ExampleJFrame extends JFrame {

    public ExampleJFrame() {
        super("Example JFrame Application");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400,400);
        this.setLayout(new BorderLayout());
        Panel1 pan1 = new Panel1();
        Panel2 pan2 = new Panel2();
        this.add(pan1, BorderLayout.NORTH);
        this.add(pan2, BorderLayout.SOUTH);
        this.setVisible(true);
    }
}

主要:

public class ExampleApplication {

    public static void main(String[] args) throws Exception {
        new ExampleJFrame();
    }

}

編輯:這是一個Panel1,內容更多。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.yaorma.example.action.sayhello.SayHelloAction;

public class Panel1 extends JPanel {

    //
    // instance variables
    //

    private JButton pressMeButton;

    //
    // constructor
    //

    public Panel1() {
        this.setLayout(new BorderLayout());
        this.add(new JLabel("This is panel 1"), BorderLayout.NORTH);
        this.initPressMeButton();
    }

    //
    // button
    //

    private void initPressMeButton() {
        this.pressMeButton = new JButton("Press Me");
        this.pressMeButton.addActionListener(new PressMeButtonActionListener());
        this.add(pressMeButton, BorderLayout.SOUTH);
    }

    //
    // method to get the parent jframe
    //

    private JFrame getParentJFrame() {
        Container con = this;
        while(con != null) {
            con = con.getParent();
            if(con instanceof JFrame) {
                return (JFrame)con;
            }
        }
        return null;
    }

    //
    // action listener for Press Me button
    //

    private class PressMeButtonActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JFrame jFrame = getParentJFrame();
            SayHelloAction action = new SayHelloAction(jFrame);
            action.execute();
        }

    }

}

通過按鈕調用的操作:

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class SayHelloAction {

    private JFrame owner;

    public SayHelloAction(JFrame owner) {
        this.owner = owner;
    }

    public void execute() {
        JOptionPane.showMessageDialog(owner, "Hello World");
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM