【问题标题】:create a component that can have different display创建一个可以有不同显示的组件
【发布时间】:2018-07-15 20:16:07
【问题描述】:

我正在尝试在 java 中创建自己的图形组件。 我希望他能有不同类型的展示:

  1. 表示 JPanel 的显示,在中心包含一个 JLabel(图 1)
  2. 表示具有 GridLayout (3,3) 的 JPanel 的显示。在这个 JPanel 中将有 9 个 JPanel。其中一些可能在中心包含 JLabel(图 2 和图 3)。

所以我想知道如何进行:我应该扩展 JComponent 还是 JPanel ..? 我还希望能够从一个显示器转到另一个显示器,即执行 actionPerformed,以便能够通过简单的方法调用来修改组件的视图。

我还没有代码,我只是在寻找开始这个课程的轨道。提前谢谢你!

【问题讨论】:

  • “所以我想知道如何进行:我应该扩展 JComponent 还是 JPanel ..?” - 这很大程度上取决于您希望如何管理代码。例如,您可以通过工厂方法简单地创建面板,它只是实例化 JPanel 并设置组件。如果标签/组件需要额外的功能(例如监视鼠标),那么自定义组件可能会很合适,因为它封装了功能并使其更易于重用。您还应该考虑是否有任何他们都共享的“通用”功能
  • “我还希望能够从一个显示器转到另一个显示器,即,按照 actionPerformed” - 然后我建议看看CardLayout,它将允许您在不同的视图之间轻松切换

标签: java swing


【解决方案1】:

实现此目的的一种方法是创建自己的 JPanel 并使用 CardLayout

请看下面的小例子:

public class MyPanel extends JPanel{

    final static String PANEL1 = "p1";
    final static String PANEL2 = "p2";

    public MyPanel(){
        super();
        this.setLayout(new CardLayout());
        this.add(getFirstDisplay(),PANEL1); 
        this.add(getSecondDisplay(),PANEL2);
    }

    private JPanel getFirstDisplay() {
        JPanel p = new JPanel();

        p.add(new JLabel("9"));

        return p;
    }

    private JPanel getSecondDisplay() {
        JPanel p = new JPanel();

        p.setLayout(new GridLayout(3, 3));

        int counter = 1;

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                p.add(new JLabel(""+counter));
                counter++;
            }
        }

        return p;
    }

    public void loadPanel(String name) {

        CardLayout cl = (CardLayout)(this.getLayout());
        cl.show(this, name);

    }

    public static void main(String[] args) {

        JFrame frame = new JFrame("Sample");

        frame.setSize(400, 400);

        MyPanel myPanel = new MyPanel();

        JButton b1 = new JButton("show 1");
        b1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                myPanel.loadPanel(PANEL1);
            }
        });

        JButton b2 = new JButton("show 2");
        b2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                myPanel.loadPanel(PANEL2);
            }
        });

        JPanel bot = new JPanel();
        bot.setLayout(new GridLayout(1,2));
        bot.add(b1);
        bot.add(b2);

        frame.setLayout(new BorderLayout());
        frame.add(myPanel, BorderLayout.CENTER);
        frame.add(bot, BorderLayout.SOUTH);

        frame.setVisible(true);

    }

}

它创建:

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2016-02-07
    • 1970-01-01
    • 2023-01-08
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多