选择 JTabbedPane 选项卡时更改 JFrame 显示
Change JFrame display when JTabbedPane tab is selected
我试图让 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.
阅读 How to Write a ChangeListener 上的 Swing 教程部分。
单击选项卡后,您将收到通知。然后您将获得选定的选项卡并将面板添加到框架中。
所以基本上您的 if (tabbedPane.getSelectedIndex() == 0)
逻辑将移至 ChangeListener。
或者不是有一堆 "if statement" 你可以有一个 Integer/JPanel 值的映射。然后你只需获取索引并从地图中获取面板。
将面板添加到框架后,您需要重新验证 () 和重新绘制 () 框架。
编辑:
其实上面的建议并不完整。您不能只是继续向框架添加面板。 BorderLayout 的 CENTER 区域应该只包含一个组件,否则你会遇到绘画问题。
这可以通过单击未选中的选项卡,然后调整框架大小来演示。将显示原始面板。
您需要执行以下操作之一:
在 BordreLayout 中心的 penel 上使用 CardLayout
(如果您以前没有使用过布局,请阅读教程)。所以在这种情况下,使用 CardLayout 的面板是 CENTER 中的唯一组件,然后它管理显示在 CardLayout 中的面板。因此,您的 ChangeListener
需要识别要显示的卡片。您可以将卡片标识符设置为所选选项卡的文本。所以
在添加新面板之前删除当前面板。在这种情况下,CENTER 中只有一个面板,因此绘画符合预期。
我试图让 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.
阅读 How to Write a ChangeListener 上的 Swing 教程部分。
单击选项卡后,您将收到通知。然后您将获得选定的选项卡并将面板添加到框架中。
所以基本上您的 if (tabbedPane.getSelectedIndex() == 0)
逻辑将移至 ChangeListener。
或者不是有一堆 "if statement" 你可以有一个 Integer/JPanel 值的映射。然后你只需获取索引并从地图中获取面板。
将面板添加到框架后,您需要重新验证 () 和重新绘制 () 框架。
编辑:
其实上面的建议并不完整。您不能只是继续向框架添加面板。 BorderLayout 的 CENTER 区域应该只包含一个组件,否则你会遇到绘画问题。
这可以通过单击未选中的选项卡,然后调整框架大小来演示。将显示原始面板。
您需要执行以下操作之一:
在 BordreLayout 中心的 penel 上使用
CardLayout
(如果您以前没有使用过布局,请阅读教程)。所以在这种情况下,使用 CardLayout 的面板是 CENTER 中的唯一组件,然后它管理显示在 CardLayout 中的面板。因此,您的ChangeListener
需要识别要显示的卡片。您可以将卡片标识符设置为所选选项卡的文本。所以在添加新面板之前删除当前面板。在这种情况下,CENTER 中只有一个面板,因此绘画符合预期。