选择JTabbedPane选项卡时更改JFrame显示

时间:2015-09-07 03:32:14

标签: java swing layout jpanel jtabbedpane

我正在尝试在选择特定选项卡时使JFrame显示不同的JPanel。我尝试添加代码,使其根据选择的选项卡索引添加新面板。

我在哪里错了?我需要添加什么才能使其正常工作?感谢。

修改

这是我解决的SSCCE:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

public class MainPanel {

    private static JTabbedPane tabbedPane = new JTabbedPane();
    private static JFrame frame = new JFrame("Testing");

    public static void main(String[] args) {

        EventQueue.invokeLater(MainPanel::createAndShowGUI);
    }

    protected static void createAndShowGUI()
    {
        DrawGraphics drawGraphics = new DrawGraphics();
        DrawDifferentGraphics drawDifferentGraphics = new DrawDifferentGraphics();
        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(tabbedPane, BorderLayout.WEST);

        tabbedPane.addTab("CFG", null);
        tabbedPane.addTab("CNX", null);

        frame.add(drawGraphics);

        tabbedPane.addChangeListener(e -> {

            if (tabbedPane.getSelectedIndex() == 0) {

                frame.remove(drawDifferentGraphics);
                frame.add(drawGraphics);
                frame.validate();
                frame.repaint();

            }

            if (tabbedPane.getSelectedIndex() == 1) {

                frame.remove(drawGraphics);
                frame.add(drawDifferentGraphics);
                frame.validate();
                frame.repaint();

            }});


        frame.setLocationByPlatform(true);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
}

class DrawGraphics extends JPanel {

    private ArrayList<Shape> shapes = new ArrayList<Shape>();

    public DrawGraphics() {

        setLayout(new BorderLayout());

        shapes.add(new Ellipse2D.Double(10, 10, 20, 20));
        shapes.add(new Ellipse2D.Double(10, 30, 20, 20));
        shapes.add(new Ellipse2D.Double(10, 50, 20, 20));
        shapes.add(new Ellipse2D.Double(10, 70, 20, 20));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D)g.create();
        g2d.setColor(Color.BLUE);

        shapes.forEach(g2d::fill);

        g2d.dispose();
    }
}

class DrawDifferentGraphics extends JPanel {

    private ArrayList<Shape> shapes = new ArrayList<Shape>();

    public DrawDifferentGraphics() {

        setLayout(new BorderLayout());

        shapes.add(new Rectangle2D.Double(10, 10, 10, 10));
        shapes.add(new Rectangle2D.Double(10, 30, 10, 10));
        shapes.add(new Rectangle2D.Double(10, 50, 10, 10));
        shapes.add(new Rectangle2D.Double(10, 70, 10, 10));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D)g.create();
        g2d.setColor(Color.RED);

        shapes.forEach(g2d::fill);

        g2d.dispose();
    }
}

1 个答案:

答案 0 :(得分:2)

  

我想在tabbedPane旁边的面板上显示图形。

阅读How to Write a ChangeListener上的Swing教程中的部分。

单击选项卡时将通知您。然后,您将获得所选选项卡并将面板添加到框架中。

所以基本上你的if (tabbedPane.getSelectedIndex() == 0)逻辑将被移动到ChangeListener。

或者没有一堆“if语句”,你可以拥有一个Integer / JPanel值。然后你就可以得到索引并从Map获得面板。

将面板添加到框架后,您需要重新验证()并重新绘制()框架。

编辑:

实际上上述建议并不完整。您不能只是继续向框架添加面板。 BorderLayout的CENTER区域应该只包含一个组件,否则可能会出现绘画问题。

通过单击未选中的选项卡,然后调整框架大小,可以证明这一点。将显示原始面板。

您需要执行以下操作之一:

  1. 在BordreLayout的CENTER中的penel上使用CardLayout(如果您之前没有使用布局,请阅读教程)。因此,在这种情况下,使用CardLayout的面板是CENTER中唯一的组件,然后它管理CardLayout中显示的面板。因此,您的ChangeListener需要识别要显示的卡片。您可以将卡标识符设置为所选选项卡的文本。所以

  2. 在添加新面板之前删除当前面板。在这种情况下,CENTER中只有一个面板,因此绘制符合预期。