首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与JSplitPane抗争

与JSplitPane抗争
EN

Stack Overflow用户
提问于 2012-09-19 02:23:58
回答 2查看 4.5K关注 0票数 1

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

代码语言:javascript
复制
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;
}

我现在像这样修改了代码:

代码语言:javascript
复制
    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();
}

以及以下内容的构造函数:

代码语言:javascript
复制
public Whiteboard() {
    this.setPreferredSize(new Dimension(width, getFullHeight()));
    this.setBackground(Color.red);   

}

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

Edit:现在看起来它终究是在调用paintComponent方法,但我仍然看到这样的屏幕:

如你所见,它看起来不是很好。好吧,我现在的main方法的代码:

代码语言:javascript
复制
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();
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-19 02:31:37

JPanel的构造函数中创建JFrame确实不应该这样做。

下面是我创建的一个示例:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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());
}
}
票数 4
EN

Stack Overflow用户

发布于 2012-09-19 05:09:03

你可以使用JSplitPane.setDividerLocation(int)来代替...

代码语言:javascript
复制
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);
            }
        });
    }
}

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12482786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档