爪哇。无法在 JScrollPane 中添加 JPanel
Posted
技术标签:
【中文标题】爪哇。无法在 JScrollPane 中添加 JPanel【英文标题】:Java. Cant add JPanel in JScrolledPane 【发布时间】:2013-05-22 19:44:03 【问题描述】:我将JTabbedPane
添加到JFrame
。
每个选项卡包含不同的bgPanel
(JPanel
以绘制的图像为背景),每个bgPanel
包含JScrollPane
,每个JScrollPane
包含一个JPane
(nowyPanel
)。
bgPanels
只是一个背景。每个JScrollPane
都有setOpaque(false);
和getViewport().setOpaque(false);
。每个JPanel
nowyPanel
都只有setOpaque(false);
。
我可以看到背景和JScrollPanels
,但看不到JPanels
。我检查了一下,似乎内容已正确添加到那里。问题在于 JPanels
没有出现。
这里有一些代码:
static class JBackgroundPanel extends JPanel
private BufferedImage img;
JBackgroundPanel()
try
img = ImageIO.read(new File("2.jpg"));
catch (IOException e)
@Override
protected void paintComponent(Graphics g)
super.paintComponent(g);
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
//method to add components to element of array nowyPanel[] JPanel
//i[a] and o are set earlier and they are fine
static void skrotyDoPaneli()
int a, b;
for (a = 0; a < o; a++)
for (b = 0; b < i[a]; b++)
nowyPanel[a].add(new dodanieIkony(ikonki[a][b], podpisyIkonek[a][b], listaOdnosnikow[a][b]));
nowyPanel[a].repaint();
nowyPanel[a].revalidate();
//set properties for all panels
static void ladowaniePaneli()
int b;
Dimension osiemsetnaszescset = new Dimension(800, 600);
for (b = 0; b < o; b++)
bgPanel[b] = new JBackgroundPanel();
vertical[b] = new JScrollPane();
nowyPanel[b] = new JPanel();
((FlowLayout) bgPanel[b].getLayout()).setVgap(0);
bgPanel[b].setPreferredSize(osiemsetnaszescset);
nowyPanel[b].setPreferredSize(osiemsetnaszescset);
vertical[b].setPreferredSize(new Dimension(789, 517));
vertical[b].setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
vertical[b].setOpaque(false);
nowyPanel[b].setOpaque(false);
vertical[b].getViewport().setOpaque(false);
vertical[b].add(nowyPanel[b]);
bgPanel[b].add(vertical[b]);
vertical[b].add(nowyPanel[b]);
//each element of bgPanel array is set as individual tab
static JTabbedPane tabbedPane()
JTabbedPane panelZakladek = new JTabbedPane();
int j;
for (j = 0; j < o; j++)
panelZakladek.addTab(nazwyGrup[j], bgPanel[j]);
return panelZakladek;
//does everything what needs to be done before JFrame shows up
static void przedStartem() throws FileNotFoundException, IOException
odczyt();
odczytPaneli();
ladowaniePaneli();
skrotyDoPaneli();
//does przedStartem() and then initialize JFrame with content
public static void main(String[] args) throws FileNotFoundException, IOException
przedStartem();
//przywolanie do zycia okna glownego JFrame
EventQueue.invokeLater(new Runnable()
@Override
public void run()
glowneOkno okno = new glowneOkno();
okno.setVisible(true);
);
//Variables Declaration
static int o = 0;
static int[] i = new int[1000];
static JBackgroundPanel[] bgPanel = new JBackgroundPanel[1000];
static JScrollPane[] vertical = new JScrollPane[1000];
static JPanel[] nowyPanel = new JPanel[1000];
static FileSystemView fsv = FileSystemView.getFileSystemView();
static String[] nazwyGrup = new String[1000];
static File plikZGrupami = new File("grupy.txt");
static String[][] podpisyIkonek = new String[1000][1000];
static Icon[][] ikonki = new Icon[1000][1000];
static String[][] listaOdnosnikow = new String[1000][1000];
static File[][] listaPlikow = new File[1000][1000];
【问题讨论】:
当所有的变量、方法和类都是静态的时,你就知道你的设计很糟糕。我建议您查看 Swing 教程,了解如何更好地构建程序的示例。 【参考方案1】:bgPanel[b].add(vertical[b]);
vertical[b].add(nowyPanel[b]);
不要将组件添加到滚动窗格。相反,代码应该是:
vertical[b].setViewportView(nowyPanel[b]);
【讨论】:
谢谢帮助。几秒钟前我自己才注意到它。不知道为什么我这样做,但现在一切正常。您的代码工作正常,但因为我更习惯它,所以我这样做了:vertical[b] = new JScrollPane(nowyPanel[b]); 我通常也是这样创建滚动窗格的。【参考方案2】:首先让我感到震惊的是你没有更改JPanel
的默认布局管理器,即FlowLayout
...尝试将JBackgroundPanel
的布局管理器更改为@改为 987654325@。
您应该避免使用setPreferredSize
。问题是它可以被程序的其他部分改变。相反,您应该重写 getPreferredSize
方法,这实际上应该在 JBackgroundPanel
类中完成。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestBackgroundPane
public static void main(String[] args)
new TestBackgroundPane();
public TestBackgroundPane()
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 TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
);
public class TestPane extends JPanel
public TestPane()
setLayout(new BorderLayout());
JPanel top = new JPanel(new GridBagLayout());
top.setOpaque(false);
top.add(new JLabel("Look ma, no hands"));
JScrollPane sp = new JScrollPane();
sp.setOpaque(false);
sp.getViewport().setOpaque(false);
sp.setViewportView(top);
add(sp);
@Override
public Dimension getPreferredSize()
return new Dimension(200, 200);
@Override
protected void paintComponent(Graphics g)
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.drawLine(0, 0, getWidth(), getHeight());
g2d.drawLine(getWidth(), 0, 0, getHeight());
g2d.dispose();
【讨论】:
以上是关于爪哇。无法在 JScrollPane 中添加 JPanel的主要内容,如果未能解决你的问题,请参考以下文章
无法在 main() 方法中实例化字段(实例变量)。为啥??爪哇
可缩放的 JScrollPane - setViewPosition 无法更新