私は物理シミュレーターに取り組んでおり、swing を使用してレンダリングしています。メニューバーやその他のコンポーネントを追加して、インターフェイスを改善したかったのです。ただし、図面をクリップしようとすると、メニュー バーの高さが考慮されず、その結果、図面が必要以上に高く移動します。説明するサンプル コードを次に示します。
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.image.BufferStrategy;
import javax.swing.border.Border;
public class TestFrame extends javax.swing.JFrame {
public TestFrame() {
initComponents();
}
public static void main(String args[]) {
//initalize and show the frame
TestFrame frame= new TestFrame();
frame.setVisible(true);
//creat buffer strategy
frame.createBufferStrategy(2);
BufferStrategy bufferStrategy = frame.getBufferStrategy();
//loop through rendering loop
while(true)
{
//get the graphics context to draw on
Graphics2D drawGraphics=(Graphics2D) bufferStrategy.getDrawGraphics();
frame.paint(drawGraphics);
Rectangle bounds=frame.drawingPanel.getBounds();
//account for frame's insets
Insets insets=frame.getInsets();
bounds.x+=insets.left;
bounds.y+=insets.top;
Border border = frame.drawingPanel.getBorder();
//account for the Border's insets
insets=border.getBorderInsets(frame.drawingPanel);
bounds.x+=insets.left;
bounds.y+=insets.top;
bounds.width-=insets.left+insets.right;
bounds.height-=insets.top+insets.right;
//draw a test rectangle
drawGraphics.setColor(new Color(0,255,0,64));
drawGraphics.fill(bounds);
//show rendering and then dispose
bufferStrategy.show();
drawGraphics.dispose();
}
}
private javax.swing.JPanel drawingPanel;
private javax.swing.JMenu editMenu;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenuBar menuBar;
}
の内容initComponents()
:
private void initComponents() {
drawingPanel = new javax.swing.JPanel();
menuBar = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
editMenu = new javax.swing.JMenu();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
drawingPanel.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
javax.swing.GroupLayout drawingPanelLayout = new javax.swing.GroupLayout(drawingPanel);
drawingPanel.setLayout(drawingPanelLayout);
drawingPanelLayout.setHorizontalGroup(
drawingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
drawingPanelLayout.setVerticalGroup(
drawingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
fileMenu.setText("File");
menuBar.add(fileMenu);
editMenu.setText("Edit");
menuBar.add(editMenu);
setJMenuBar(menuBar);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(drawingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(284, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(drawingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(162, Short.MAX_VALUE))
);
pack();
}
私が考えることができる他のオプションは、描画コードを のpaint
メソッドに配置することjPanel
です。