私は実際には何か変わったことに悩まされています。実際の画面よりはるかに大きなjPanelを含むJScrollPaneを持つJFrameがあります。私は列の中に四角形を描き、これらの正方形がjPanelの右の枠線の上に来るようにします。 (つまり、右にスクロールすると表示されます)。ただし、paintComponentsメソッドでペイントした四角形は、JScrollPaneの表示可能なViewPortで停止します。JScrollPanelのpaintComponentを使った描画
ここたJFrameの内部JScrollPaneのための私のコードです:
ます。public void initComponents(){
mainPanel = new DrawPanel(dim);
this.getContentPane().setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridheight = 1;
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.BOTH;
JScrollPane jsp = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jsp.setLayout(new ScrollPaneLayout());
jsp.setViewportView(mainPanel);
jsp.getVerticalScrollBar().setUnitIncrement(20);
jsp.setBorder(BorderFactory.createEmptyBorder());
jsp.setPreferredSize(new Dimension(dim.width,dim.height -taskBarSize));
jsp.setMinimumSize(new Dimension(dim.width,dim.height -taskBarSize));
jsp.setMaximumSize(new Dimension(dim.width,dim.height -taskBarSize));
this.getContentPane().add(jsp, gbc);
this.getContentPane().revalidate();
this.getContentPane().repaint();
}
そして、ここでは私のJPanelクラスです:
パブリッククラスDrawPanelはJPanelのを{拡張
private Dimension dim;
private Integer numberPanels = 7;
private Double startPointX;
private Double startPointY;
private Double heightRow;
private Double heightPanel;
public DrawPanel(Dimension d) {
this.dim = d;
//this.setBackground(Color.BLACK);
calculateStartPoint();
}
public void calculateStartPoint() {
startPointX = (dim.getWidth()/10) * 1;
startPointY = (dim.getHeight()/10) * 1;
heightRow = (dim.getHeight() * 0.8)/numberPanels;
heightPanel = heightRow - 10;
double colums = 366/numberPanels;
this.setPreferredSize(new Dimension((int)(heightRow *((int)colums + 1)), dim.height));
this.setMinimumSize(new Dimension((int)(heightRow *((int)colums + 1)), dim.height));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GRAY);
for (int i = 1; i <= 366; i++) {
// Si c'est le dernier d'une colonne
if (i%numberPanels == 0 && i != 0) {
g.fillRect(startPointX.intValue(), startPointY.intValue(), heightPanel.intValue(),
heightPanel.intValue());
startPointX = startPointX + heightRow;
startPointY = startPointY - ((numberPanels -1) * heightRow);
// Si c'est encore dans la meme colonne
} else {
g.fillRect(startPointX.intValue(), startPointY.intValue(), heightPanel.intValue(),
heightPanel.intValue());
startPointY = startPointY + heightRow;
}
}
}
}
起動時:
私がスクロール移動:すべてのdisapreasのサイズ変更にも
を、。また、スクロールバックすると、既に塗られた四角形が消されてしまったように見えました。
ありがとうございました。
:たとえば、これは私があなたのコード、今誰により、コピー貼り付けして実行可能なコードで作られたものMCVEです。 –