ジム/ランニングからの統計をログに記録する、私自身の使用のためのロギング ツールをまとめ始めたところです。swing/awt での唯一の経験は、Graphics2D オブジェクトを完全に制御でき、そうでないゲームのアクティブ レンダリングです。オーバーライドされたペイントを使用してスイング コンポーネントを実装することに依存します。
とにかく、パネルの 1 つに追加できるダミーの JComponent を作成したいと考えていました (このパネルは、オプションを使用して別のサイドパネルから選択したものに応じて、グラフィック、統計などを表示します)。前述のパネルを使用し、マウスドラッグで選択用の四角形を描画して、より高い解像度が存在する場合にデータを拡大できるようにします。方法がわかりません。コンポーネントをパネルに追加しましたが、パネル内には何も登録されません。代わりに、パネル/フレームの下部に限定されたローカル スペースがあるようです。
ここにコンポーネントがあります
package gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JComponent;
@SuppressWarnings("serial")
public class MarkerRectangle extends JComponent implements MouseListener,
MouseMotionListener {
private boolean draw;
private int startX, endX, startY, endY;
private Color color = new Color(0, 255, 0, 100);
public MarkerRectangle(int width, int height) {
setPreferredSize(new Dimension(width, height));
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse clicked@ " + e.getX() + "," + e.getY());
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entered @ " + e.getX() + "," + e.getY());
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse left @ " + e.getX() + "," + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse pressed@ " + e.getX() + "," + e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse was released @ " + e.getX() + "," + e.getY());
}
@Override
public void mouseDragged(MouseEvent e) {
System.out.println("Mouse being dragged, currently@ " + e.getX() + ","
+ e.getY());
}
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("I registered a move@ " + e.getX() + "," + e.getY());
}
@Override
// Draw rectangle
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.dispose();
}
}
パネル_
public class GraphPane extends JPanel {
public GraphPane(Graph graph) {
this.add(graph);
this.add(new MarkerRectangle(800, 600));
this.setBackground(Color.gray);
this.setPreferredSize(new Dimension(800, 600));
}
}
グラフには、ランダム データ atm が保持されます
public class Graph extends JComponent {
private GeneralPath data;
private Stroke stroke;
public Graph() {
this.data = new GeneralPath();
this.stroke = new BasicStroke(3f);
this.setPreferredSize(new Dimension(750, 550));
init();
}
private void init() {
data.moveTo(0, 0);
double cntr = 0;
double[][] points = new double[10][1];
for (double[] point : points) {
cntr += 100;
point[0] = Math.random() * 100;
point[1] = Math.random() * 100;
data.lineTo(cntr, point[1]);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(stroke);
g2d.draw(data);
g2d.dispose();
}
}
上記のようなものを実装したいのは、最終的には GUI が非常に複雑になり、データをマークするための四角形を描画するような単純なイベントになると想像するためです (多くの if テストとコードの乱雑さを防ぐため)。 )。
私が得るもののスクリーンショット:
私が欲しいもの:
編集 以下の受け入れられた回答はより良い解決策ですが、誰かがそれを使用したい場合に備えてこれを投稿しています。preferredSize より小さいサイズに変更すると機能しません。
public class Test {
public static void main(String[] args) {
GeneralJFrame frame = new GeneralJFrame(1200, 800);
frame.addPanel(new GraphPane(new Graph()), BorderLayout.CENTER);
frame.addPanel(new ButtonPane(), BorderLayout.SOUTH);
frame.addPanel(new ButtonPane(), BorderLayout.SOUTH);
frame.addPanel(new ButtonPane(), BorderLayout.WEST);
frame.addPanel(new ButtonPane(), BorderLayout.EAST);
frame.addPanel(new ButtonPane(), BorderLayout.NORTH);
frame.start();
}
}
public class GraphPane extends JPanel {
public GraphPane(Graph graph) {
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = GridBagConstraints.REMAINDER;
c.gridx = 0;
c.gridy = 0;
this.setLayout(new GridBagLayout());
this.add(graph);
this.add(new MarkerRectangle(), c);
this.setBackground(new Color(205, 201, 201));
}
}
public class MarkerRectangle extends JComponent implements MouseListener,
MouseMotionListener {
private boolean draw;
private int startX, endX, startY, endY;
public MarkerRectangle() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
setOpaque(false);
setPreferredSize(new Dimension(800, 600));
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
startX = e.getX();
startY = e.getY();
draw = true;
}
@Override
public void mouseReleased(MouseEvent e) {
draw = false;
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
endX = e.getX();
endY = e.getY();
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
// Draw rectangle
protected void paintComponent(Graphics g) {
System.out.println(getSize());
if (!draw)
return;
int w = endX-startX;
int h = endY - startY;
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(new Color(255, 165, 0));
g2d.fillRect(startX, startY, w, h);
g2d.dispose();
}
}
public class ButtonPane extends JPanel {
public ButtonPane() {
add(new JButton("HELLO"));
setBackground(Color.gray);
setBorder(BorderFactory.createEtchedBorder(Color.white,
Color.gray.darker()));
}
}
public class GeneralJFrame {
private JFrame frame;
public GeneralJFrame(int width, int height) {
this.frame = new JFrame("Le Muscles");
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void addPanel(JPanel panel, String location) {
this.frame.add(panel, location);
}
public void start() {
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
出力: (オレンジ色はマウスでドラッグ)