JScrollPane for a JPanel inside a JPanel(JPanel中的JPanel的JScrollPane)
问题描述
阅读this answer后,我来到using getPreferredSize instead of setPreferredSize。但我仍然不能使用@Override getPreferredSize
,但这不是我现在面临的主要问题。
我有一个CardLayout
应用程序,它调用一个名为HiraganaData的类
HiraganaData是一个扩展了JPanel
以便CardLayout
可以使用的类,但它上还有两个JPanel
,一个用于后退按钮,一个用于其余按钮,在使用这个想法之前,我使用了一个JTable,但在将单元格作为按钮制作时遇到了问题,所以我放弃了这个想法,并使用GridLayout
来了这个新的按钮。某些按钮将被禁用,但无论如何我都可以这样做,并且不会包括该代码,因为它不相关。
所以我的实际问题是:
- 如何才能将
JScrollPane
仅添加到buttonsPanel
,尽了最大努力 正在尝试将其添加到整个全局&q;窗格中,但未成功。
这是我可以使用与我的类相同的代码所能做的最接近的图形用户界面,我只是在其中添加了一个JFrame。
不确定是否相关,但我按照@MadProgrammer在this answer上建议的方式使用了大小不同的CardLayout
。
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中的外观。
推荐答案
您面临的主要问题是在将buttonsPane
添加到pane
...
JScrollPane scroll = new JScrollPane(buttonsPanel);
pane.add(buttonsPanel);
this.add(pane, BorderLayout.CENTER);
而且,您从未真正将滚动窗格添加到任何内容的事实也没有帮助。
一个组件可能只有一个父项,因此当您将buttonsPane
添加到pane
时,它实际上会从滚动窗格中删除
HiraganaPage
的布局管理器设置为BorderLayout
,将buttonsPanel
添加到滚动窗格,并将滚动窗格添加到HiraganaPage
的CENTER
位置,然后将pane
添加到HiraganaPage
的NORTH
位置
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);
}
}
}
这篇关于JPanel中的JPanel的JScrollPane的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:JPanel中的JPanel的JScrollPane
基础教程推荐
- 在螺旋中写一个字符串 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01