gpt4 book ai didi

java - 与 JSplitPane 斗争

转载 作者:行者123 更新时间:2023-11-29 06:40:49 24 4
gpt4 key购买 nike

好吧,我有一些关于使用拆分 Pane 将我的框架分成两个区域的技巧,但我无法让它显示一些有用的东西。代码如下所示:

public class Whiteboard extends JPanel {

int width = 600;
int sidePanelWidth = 200;
int lineHeight = 120;
int numberOfLines = 5;
JFrame frame = null;
Glyph glyph = null;
//java.awt.Rectangle bounds = new java.awt.Rectangle();
Bounds bounds = null;
JSplitPane splitPane = null;
JPanel tools = null;


public Whiteboard() {
frame = new JFrame();
frame.setSize(width + sidePanelWidth, getFullHeight());
FlowLayout simpleLayout = new FlowLayout();
frame.setLayout(simpleLayout);

tools = new JPanel();
tools.setSize(new Dimension(sidePanelWidth, getFullHeight()));
this.setSize(width, getFullHeight());

splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, this, tools);
splitPane.setPreferredSize(new Dimension(width + sidePanelWidth, getFullHeight()));
splitPane.setOneTouchExpandable(false);
splitPane.setDividerLocation(150);

frame.add(splitPane);
this.setBackground(Color.white);
java.awt.Rectangle rectBounds = this.getBounds();
bounds = new Bounds((int)rectBounds.getX(), (int)rectBounds.getY(), (int)(rectBounds.getX() + rectBounds.getWidth()), (int)(rectBounds.getY() + rectBounds.getHeight()));

}

public int getFullHeight() {
return lineHeight * numberOfLines;
}

我现在把代码改成这样:

    public static void main(String[] args) {
int sidePanelWidth = 200;

JFrame frame = new JFrame();
Whiteboard whiteboard = new Whiteboard();

JPanel sidePanel = new JPanel();
sidePanel.setPreferredSize(new Dimension(sidePanelWidth, whiteboard.getFullHeight()));


JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.add(whiteboard, JSplitPane.LEFT);
splitPane.add(sidePanel, JSplitPane.RIGHT);

frame.setLayout(new FlowLayout());
frame.getContentPane().add(splitPane);


frame.pack();
frame.setVisible(true);
whiteboard.repaint();
}

以及这个的构造函数:

public Whiteboard() {
this.setPreferredSize(new Dimension(width, getFullHeight()));
this.setBackground(Color.red);

现在不知道是哪里出了问题,可能是没有调用paintComponent方法吧。我尝试通过调用 repaint() 来强制它,但它没有帮助,它只是不调用这个组件

编辑:好吧,现在看来它毕竟是在调用 paintComponent 方法,但我仍然得到这样的屏幕: enter image description here

如您所见,它看起来不太好。那么我目前主要方法的代码:

public static void main(String[] args) {
int sidePanelWidth = 200;

JFrame frame = new JFrame();
Whiteboard whiteboard = new Whiteboard();

JPanel sidePanel = new JPanel();
sidePanel.setPreferredSize(new Dimension(sidePanelWidth, whiteboard.getFullHeight()));


JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.add(whiteboard, JSplitPane.LEFT);
splitPane.add(sidePanel, JSplitPane.RIGHT);

frame.setLayout(new FlowLayout());
frame.getContentPane().add(splitPane);

frame.pack();
frame.setVisible(true);
whiteboard.repaint();
}

知道如何更改它来解决问题吗?我需要发布其他方法吗?

最佳答案

JPanel 的构造函数中创建一个 JFrame 真的不应该这样做。

这是我创建的示例:

Screen shot

import java.awt.Container;
import java.awt.Dimension;
import javax.swing.*;

public class JavaApplication100 {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new JavaApplication100().createAndShowUI();
}
});
}

private void createAndShowUI() {

JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

initComponents(frame.getContentPane());

frame.pack();
frame.setVisible(true);
}

private void initComponents(Container contentPane) {
JPanel mainPanel = new JPanel();

//create our 2 seperate panels (could be custom ones)
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();

//add labels for viewing
leftPanel.add(new JLabel("LEFT"));
rightPanel.add(new JLabel("RIGHT"));

//just so you can see em or they would be small
leftPanel.setPreferredSize(new Dimension(300, 300));
rightPanel.setPreferredSize(new Dimension(300, 300));

JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);

//add panels to split pane
jsp.add(rightPanel, JSplitPane.RIGHT);
jsp.add(leftPanel, JSplitPane.LEFT);

mainPanel.add(jsp);//add splitpane to mainpanel
contentPane.add(mainPanel);

}
}

编辑/更新:

根据您的评论,如果您想在扩展 JPanelWhiteBoard 中为背景覆盖 paintComponent(Graphics g) 着色,如下所示:

public class WhiteBoard extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.red);
g2.fillRect(0, 0, getWidth(), getHeight());
}
}

关于java - 与 JSplitPane 斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12482786/

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