2017-05-26 3 views
3

JPanelを作成してJFrameに追加しました。 JPanelTitledBorderを有しているが、私は方法translate()を使用する場合、例えば、境界を含むtranslate()メソッドが使用されたときにJPanelのTitledBorderが移動します

g2.translate(getWidth()/2, getHeight()/2); 

全成分は、翻訳されます。効果は、所望の結果を以下の図に描かれている図1 Figure 1

上に提示されます。 Figure 2

コードを下に貼り付けます。

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

class GPanel extends JPanel { 
    private void doDrawing(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.translate(getWidth()/2, getHeight()/2); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     doDrawing(g); 
    } 
} 

class Main extends JFrame { 
    public Main() { 
    } 

    public static void main(String[] args) { 
     Main ex = new Main(); 
     ex.setSize(new Dimension(400, 400)); 
     GPanel panel = new GPanel(); 
     panel.setBorder(BorderFactory.createTitledBorder("Title")); 
     ex.add(panel); 
     ex.setLocationRelativeTo(null); 
     ex.setVisible(true); 
    } 
} 
+0

これはJFrameで使用されているレイアウトマネージャに起因する可能性がありますか? GPanelを保持するために枠線付きのJPanelを作成すると、エラーは解決されませんか? – DCON

答えて

3

あなたはGPanelのインスタンスにsetBorder()を呼び出した後、グラフィックスコンテキストのpaintComponent()の後者の実装に変換変更しました。国境はこれを知らないので、結果は完全に期待されます。代わりにsetBorder()の親のJComponent実装のアドバイスに従ってください: "JPanelにコンポーネントを置き、JPanelに境界線を設定してください。"関連する例がhereと示されている。以下の変形例では

  • 囲むbPanelは今Borderを有し、そして囲まgPanel安全グラフィックスコンテキストを操作することができます。

  • translate()より前には、赤い点が原点の中心にあります。 translate()の後、青い点は原点の中心にありますが、原点は移動しています。

  • 実際にgetPreferredSize()を上書きする場合は、setPreferredSize()を使用しないでください。

  • JFrameを不必要に延長しないでください。

image

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

class GTest { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     GPanel gPanel = new GPanel(); 
     JPanel bPanel = new JPanel(); 
     bPanel.setBorder(BorderFactory.createTitledBorder("Title")); 
     bPanel.add(gPanel); 
     f.add(bPanel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static class GPanel extends JPanel { 

     private static final int N = 16; 

     private void doDrawing(Graphics g) { 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setPaint(Color.red); 
      g.fillOval(-N, -N, 2 * N, 2 * N); 
      g2.translate(getWidth()/2, getHeight()/2); 
      g2.setPaint(Color.blue); 
      g.fillOval(-N, -N, 2 * N, 2 * N); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      doDrawing(g); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(256, 256); 
     } 
    } 
} 
0

このコードを試してみてください。

private void doDrawing(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.translate(0, 0); 
    } 
+0

ありがとうございますが、このコードでは問題は解決しません。原点を '(width/2、height/2) 'に変換する必要があります – Andrej

3

あなたはg2.translate(-x, -y);g2.translate(x, y);を実行することで作られた動きを復元する必要があるかもしれません:

Graphics2D g2 = (Graphics2D) g; 
double x = getWidth()/2d; 
double y = getHeight()/2d; 
g2.translate(x, y); 
g2.setPaint(Color.BLUE); 
g2.fill(s); 
g2.translate(-x, -y); 

もう一つの一般的な方法は、コピーである新しいGraphicsオブジェクトを使用することですのGPanelのGraphicsオブジェクト:

Graphics2D g2 = (Graphics2D) g.create(); 
g2.translate(getWidth()/2, getHeight()/2); 
g2.setPaint(Color.BLUE); 
g2.fill(s); 
g2.dispose(); 

メイン2。Java

import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 

class GPanel extends JPanel { 
    private final Rectangle s = new Rectangle(0, 0, 16, 16); 
    private void doDrawing(Graphics g) { 
    g.setColor(Color.RED); 
    g.fillRect(s.x, s.y, s.width, s.height); 

//  Graphics2D g2 = (Graphics2D) g; 
//  double x = getWidth()/2d; 
//  double y = getHeight()/2d; 
//  g2.translate(x, y); 
//  g2.setPaint(Color.BLUE); 
//  g2.fill(s); 
//  g2.translate(-x, -y); 

    Graphics2D g2 = (Graphics2D) g.create(); 
    g2.translate(getWidth()/2, getHeight()/2); 
    g2.setPaint(Color.BLUE); 
    g2.fill(s); 
    g2.dispose(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    doDrawing(g); 
    } 
} 

public class Main2 extends JFrame { 
    public static void main(String[] args) { 
    EventQueue.invokeLater(() -> { 
     GPanel panel = new GPanel(); 
     panel.setBorder(BorderFactory.createTitledBorder("Title")); 
     JFrame ex = new JFrame(); 
     ex.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     ex.getContentPane().add(panel); 
     ex.setSize(400, 400); 
     ex.setLocationRelativeTo(null); 
     ex.setVisible(true); 
    }); 
    } 
} 
関連する問題