本文介紹了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的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,