使用jsprollpane内的jscrollpane内的canvas调整问题

我正在使用NetBeans GUI编辑器创build一个应用程序,在这个应用程序中我想要一个JSplitPane ,它的顶层组件是JScrollPane一个Canvas ,底层组件是一个JTextArea ,或类似的东西。

当我向下拉分隔器,从而增加顶部组件的大小时,一切似乎都调整得很好。

当我试图向上推分隔线时,问题就出现了:分隔线似乎在Canvas下面(也可能在JScrollPane下面)。

我已经尝试了JScrollPaneCanvas的首选/最小/最大尺寸的各种组合,但似乎没有任何工作。

这是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); 

由于这是我的第一个问题,我不允许在问题中embedded图片,因此我只会发布链接:

红色箭头表示分隔器的位置。

预先感谢您的时间。

而不是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(); } }); } } 

正如我在我的评论中所说的,你不应该混用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(); } } 

在阅读了davidbuzatto的评论之后,我使用了关于混合AWT和Swing组件的内容,我有点惊讶地发现这是一个糟糕的做法。

我在这里find了最准确的答案

重量级组件有自己的Zsorting。 这就是Swing和AWT不能在一个容器中组合的原因。 如果是的话,AWT组件将在Swing组件的TOP上绘制。

例如:当AWT组件与JtabbedPane一起使用时,切换选项卡时它们不会消失。

谢谢davidbuzatto向我展示的方式:-)