2017-05-26 23 views
3

我已创建JPanel并将其添加到JFrameJPanel具有TitledBorder,但是当我使用的方法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上使用的布局管理器造成的吗?如果您创建一个标题为边界的JPanel来保存GPanel,错误是否会持续? – DCON

回答

3

你对GPanel一个实例调用setBorder()然后修改图形上下文的在后者的实施paintComponent()变换。边界不知道这一点,所以显示的结果是完全可以预料的。请按照的父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(); 

MAIN2。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); 
    }); 
    } 
} 
相关问题