JFrame
a 中有一个名为 a的面板,WatchPanel extends JPanel
它使用 aGroupLayout
并包含 a WatchListPanel extends JPanel
。使用WatchListPanel
anull
LayoutManager
并包含 的几个实例WatchItemPanel extends JPanel
。WatchItemPanel
用GridBagLayout
. _
当我加载框架并实例化 时WatchPanel
,我预加载了WatchListPanel
三个WatchItemPanel
带有数据的实例。这些工作正常。我的实现允许通过拖放(因此null
布局)对这些进行重新排序,并且效果也很好。上面WatchPanel
是一个添加新手表的按钮,它会弹出一个自己的新面板,JFrame
可以在其中添加手表。当在这个新面板上按下“保存”按钮时,它会将新手表添加到 ,它会WatchPanel
向下滴入WatchListPanel
并关闭JFrame
以添加新手表。
问题是当这个新WatchItemPanel
的被添加时,它不会被绘制,除非我调整JFrame
包含WatchPanel
. 我可以通过拖放与它进行交互。我什至可以拖动那个特定的面板——但它是空白的。我调整大小的那一刻WatchPanel
,它出现并正确绘制。
现在,我已经在列表中的每个实例上重写了调用setBounds
方法,但是我在添加它时已经调用了新方法。我已经尝试在每个可以想象的地方添加和调用,我想也许我错过了一些东西,但没有运气。我绝对已经在新面板上添加了,和,和。WatchListPanel
setSize
repaint
WatchItemPanel
setBounds
repaint
WatchItemPanel
repaint
invalidate
WatchItemPanel
WatchListPanel
setBounds
setVisible(true)
repaint
以下是 上的addWatch
和updatePositions
方法WatchListPanel
:
公共无效addWatch(手表手表){ WatchItemPanel watchPanel = new WatchItemPanel(watch); 同步(this.watches){ this.watches.add(watch); } this.watchPanels.put(watch, watchPanel); this.add(watchPanel); watchPanel.setOpaque(false); watchPanel.setForeground(this.getForeground()); watchPanel.setBackground(this.getBackground()); watchPanel.setVisible(true); watchPanel.setSize(this.getWidth(), WatchItemPanel.PANEL_HEIGHT); for (MouseListener l: this.mouseListeners) watchPanel.addMouseListener(l); for (MouseMotionListener l: this.mouseMotionListeners) watchPanel.addMouseMotionListener(l); this.updatePositions(); } 私人无效更新位置(){ 整数计数 = 0; 同步(this.watches){ 对于(手表手表:this.watches){ if ((this.selectedWatchPanel != null) && (count == this.selectedWatchPanelPosition)) 计数++; WatchItemPanel 面板 = this.watchPanels.get(watch); 如果(面板 == this.selectedWatchPanel) 继续; panel.setBounds(0, count * WatchItemPanel.PANEL_HEIGHT, this.getWidth(), WatchItemPanel.PANEL_HEIGHT); 计数++; } } 如果(this.selectedWatchPanel!= null) this.selectedWatchPanel.setBounds(0, (this.selectedWatchPanelPosition * WatchItemPanel.PANEL_HEIGHT) + this.selectedWatchPanelDragOffset, this.getWidth(), WatchItemPanel.PANEL_HEIGHT); this.repaint(); }
以下是有关的setBounds
方法WatchListPanel
:
@覆盖 公共无效 setBounds(矩形 r){ super.setBounds(r); for (WatchItemPanel 面板: this.watchPanels.values()) { panel.setSize(r.width, WatchItemPanel.PANEL_HEIGHT); panel.repaint(); } } @覆盖 公共无效setBounds(int x,int y,int宽度,int高度){ super.setBounds(x, y, width, height); for (WatchItemPanel 面板: this.watchPanels.values()) { panel.setSize(宽度, WatchItemPanel.PANEL_HEIGHT); panel.repaint(); } }
这里的另一条信息 - 所有四个面板都在涂漆。我覆盖paintComponent
并WatchItemPanel
添加了一个System.out.println
并得到了这个结果:
WatchItemPanel[,0,66,366x22,invalid,layout=java.awt.GridBagLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777219,maximumSize=,minimumSize=,preferredSize=] WatchItemPanel[,0,44,366x22,layout=java.awt.GridBagLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777219,maximumSize=,minimumSize=,preferredSize=] WatchItemPanel[,0,22,366x22,layout=java.awt.GridBagLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777219,maximumSize=,minimumSize=,preferredSize=] WatchItemPanel[,0,0,366x22,layout=java.awt.GridBagLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777219,maximumSize=,minimumSize=,preferredSize=]
面板中那个额外的“无效”列是什么?当我调整大小时WatchPanel
,“无效”消失了。不过,它看起来像一个额外的列。其他行没有相应的非无效值。JPanel.toString()
(这是删除了包名的默认输出。