gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:23:53 25 4
gpt4 key购买 nike

我试图在选择特定选项卡时使 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();
}
}

最佳答案

I want to display the graphics on the panel next to the tabbedPane.

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

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

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

或者,您可以使用 Integer/JPanel 值的映射,而不是使用一堆“if 语句”。然后您只需获取索引并从 map 中获取面板即可。

将面板添加到框架后,您需要 revalidate() 和 repaint() 框架。

编辑:

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

这可以通过单击未选择的选项卡然后调整框架大小来演示。将显示原始面板。

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

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

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

关于java - 选择 JTabbedPane 选项卡时更改 JFrame 显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com