我有一些关于使用拆分窗格将框架分成两个区域的技巧,但我无法让它显示一些有用的东西。代码如下所示:
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()来强制它,它没有帮助,它只是不调用这个组件
Edit:现在看起来它终究是在调用paintComponent方法,但我仍然看到这样的屏幕:

如你所见,它看起来不是很好。好吧,我现在的main方法的代码:
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();
}你知道如何改变它来解决这个问题吗?我需要发布其他方法吗?
发布于 2012-09-19 02:31:37
从JPanel的构造函数中创建JFrame确实不应该这样做。
下面是我创建的一个示例:

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);
}
}编辑/更新:
根据您的评论,如果您想为背景着色,请覆盖WhiteBoard中的paintComponent(Graphics g),它扩展了JPanel,如下所示:
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());
}
}发布于 2012-09-19 05:09:03
你可以使用JSplitPane.setDividerLocation(int)来代替...
public class TestSplitPane extends JFrame {
public TestSplitPane() throws HeadlessException {
setSize(600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setLeftComponent(new JLabel("I'm on the left"));
splitPane.setRightComponent(new JLabel("I'm on the right"));
add(splitPane);
splitPane.setDividerLocation(200);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
new TestSplitPane().setVisible(true);
}
});
}
}

https://stackoverflow.com/questions/12482786
复制相似问题