我正在使用NetBeans GUI编辑器创建一个应用程序,其中我想要一个JSplitPane
,其顶部组件将是Canvas
中的JScrollPane
和底部组件将是JTextArea
,或类似的东西。
当我向下拉动分隔线,从而增加顶部组件的尺寸时,一切看起来都很好。
当我试图向上推动分频器时出现问题:
分隔符似乎低于Canvas
(也可能低于JScrollPane
)。
我尝试了JScrollPane
和Canvas
的首选/最小/最大尺寸的各种组合,但似乎没有任何效果。
这是Netbeans生成的代码的一部分,可能与手头的问题有关:
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
canvas1 = new java.awt.Canvas();
jTextField1 = new javax.swing.JTextField();
jSplitPane1.setDividerLocation(300);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jScrollPane1.setViewportView(canvas1);
jSplitPane1.setTopComponent(jScrollPane1);
jTextField1.setText("jTextField1");
jSplitPane1.setRightComponent(jTextField1);
由于这是我的第一个问题,我不允许在问题中嵌入图片,所以我只想发布链接:
红色箭头表示分隔符的位置。
提前感谢您的时间。
答案 0 :(得分:9)
而不是setPreferredSize()
,让您的组件计算自己的首选大小,pack()
包含Window
以容纳。{}下面的示例在顶部添加了draw.GraphPanel
的实例,在底部添加了相应的控制面板。
import draw.GraphPanel;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
/**
* @see https://stackoverflow.com/q/11942961/230513
*/
public class SplitGraph extends JPanel {
public SplitGraph() {
super(new GridLayout());
JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
GraphPanel graphPanel = new GraphPanel();
split.setTopComponent(new JScrollPane(graphPanel));
split.setBottomComponent(graphPanel.getControlPanel());
this.add(split);
}
private void display() {
JFrame f = new JFrame("SplitGraph");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new SplitGraph().display();
}
});
}
}
答案 1 :(得分:4)
正如我在评论中所说,你不应该混合使用AWT和Swing组件。我认为您没有以正确的方式使用组件。看一下,这是一个如何使用JSplitPane的简单示例。
import java.awt.*; // it is necessary to use the Dimension and BorderLayout classes
import javax.swing.*;
public class Foo extends JFrame {
public Foo() {
setTitle( "Splits" );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setSize( 400, 400 );
JSplitPane split = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
split.setDividerLocation( 200 );
add( split );
JPanel panel1 = new JPanel();
panel1.setLayout( new BorderLayout() );
panel1.add( new JLabel( "top panel" ), BorderLayout.NORTH );
JPanel myDrawPanel = new JPanel();
myDrawPanel.setPreferredSize( new Dimension( 100, 100 ) );
myDrawPanel.add( new JLabel( "draw panel here!" ) );
panel1.add( new JScrollPane( myDrawPanel ), BorderLayout.CENTER );
split.setTopComponent( panel1 );
JPanel panel2 = new JPanel();
panel2.add( new JLabel( "bottom panel" ) );
split.setBottomComponent( panel2 );
setVisible( true );
}
public static void main( String[] args ) {
new Foo();
}
}
答案 2 :(得分:3)
在阅读了davidbuzatto的评论之后,我搜索了关于混合AWT和Swing组件的问题,我有点惊讶地发现这是一个非常糟糕的做法。
我找到了问题here
的最准确答案重量级组件有自己的Z排序。这就是为什么Swing和AWT不能组合在一个容器中的原因。如果是,则AWT组件将在Swing组件的TOP上绘制。
例如:当AWT组件与JtabbedPane一起使用时,切换选项卡时它们不会消失。
感谢davidbuzatto向我展示道路: - )