首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JScrollPane用于JPanel在JPanel中

JScrollPane用于JPanel在JPanel中
EN

Stack Overflow用户
提问于 2014-07-28 02:50:38
回答 1查看 1.2K关注 0票数 4

读完this answer后,我来到了using getPreferredSize instead of setPreferredSize。但是我仍然不能使用@Override getPreferredSize,但这不是我现在面临的主要问题。

我有一个CardLayout应用程序,它调用一个名为HiraganaData的类

HiraganaData是一个类,它扩展了一个JPanel,以便它可以被CardLayout使用,但它上还有两个JPanel,一个用于“后退”按钮,另一个用于其余的按钮,在使用这个想法之前,我使用的是JTable,但是在将单元格作为按钮时遇到了问题,所以我放弃了这个想法,并使用GridLayout提供了这个新的JPanel。有些按钮将被禁用,无论如何,我可以这样做,并且不会包含该代码,因为它是不相关的。

所以我的实际问题是:

  • 我如何将JScrollPane only添加到buttonsPanel中,并尽我最大努力将其添加到整个“全局”窗格w/o成功中。

这是我能用我的类中相同的代码所能做的最接近的GUI,我刚刚向它添加了一个JFrame。

不确定是否相关,但我使用的是不同大小的CardLayout,就像@MadProgrammer在this answer上建议的那样。

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.DefaultCellEditor;
import java.awt.Dimension;

public class HiraganaPage extends JPanel {
    JFrame frame = new JFrame("Hello");
    JButton kanas[][] = new JButton[26][5];
    JButton backButton = new JButton("back");
    JPanel backPanel = new JPanel();
    JPanel buttonsPanel = new JPanel();
    
    public static void main(String args[]) {
        new HiraganaPage();
    }
    
    public HiraganaPage() {
        JPanel pane = new JPanel();
        backPanel.add(backButton);
        buttonsPanel.setLayout(new GridLayout(0, 5));
        pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
        pane.add(backPanel);
        
        //pane.setPreferredSize(new Dimension(500, 500));
        
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < 5; j++) {
                kanas[i][j] = new JButton("1");
                buttonsPanel.add(kanas[i][j]);
            }
        }
        
        JScrollPane scroll = new JScrollPane(buttonsPanel);
        pane.add(buttonsPanel);
        this.add(pane, BorderLayout.CENTER);
        frame.add(this);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(50, 50);
        frame.setSize(300, 300);
    }
}

这就是在我的完整应用程序中的样子。

这就是在MCVE中的样子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-28 02:58:45

您面临的主要问题是,当您将buttonsPane添加到pane时,会从滚动窗格中删除它。

代码语言:javascript
复制
JScrollPane scroll = new JScrollPane(buttonsPanel);
pane.add(buttonsPanel);
this.add(pane, BorderLayout.CENTER);

实际上,您从未将滚动窗格添加到任何东西中,这一点也没有帮助。

组件可能只有一个父组件,因此当您将buttonsPane添加到pane时,它将有效地从滚动窗格中删除。

相反,将HiraganaPage的布局管理器设置为BorderLayout,将buttonsPanel添加到滚动窗格,并将滚动窗格添加到HiraganaPageCENTER位置,然后将pane添加到HiraganaPageNORTH位置

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestScrollPane {

    public static void main(String[] args) {
        new TestScrollPane();
    }

    public TestScrollPane() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new HiraganaPage());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class HiraganaPage extends JPanel {

        JFrame frame = new JFrame("Hello");
        JButton kanas[][] = new JButton[26][5];
        JButton backButton = new JButton("back");
        JPanel backPanel = new JPanel();
        JPanel buttonsPanel = new JPanel();

        public HiraganaPage() {
            setLayout(new BorderLayout());

            JPanel pane = new JPanel();
            backPanel.add(backButton);
            buttonsPanel.setLayout(new GridLayout(0, 5));
            pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
            pane.add(backPanel);

//            pane.setPreferredSize(new Dimension(500, 500));

            for (int i = 0; i < 26; i++) {
                for (int j = 0; j < 5; j++) {
                    kanas[i][j] = new JButton("1");
                    buttonsPanel.add(kanas[i][j]);
                }
            }

            add(pane, BorderLayout.NORTH);
            add(new JScrollPane(buttonsPanel));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    }

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

https://stackoverflow.com/questions/24987832

复制
相关文章

相似问题

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