uso titledborder setborder poner crear con borderfactory borde java swing jframe jpanel border

java - setborder - TitledBorder en JPanel se mueve cuando se utiliza el método translate()



titledborder java (3)

Es posible que deba restaurar el movimiento realizado ejecutando g2.translate(x, y); con 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);

Otra forma común es utilizar un nuevo objeto Graphics que es una copia del objeto Graphics de GPanel:

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); }); } }

JPanel un JPanel y lo JPanel a un JFrame . JPanel tiene TitledBorder , pero cuando uso el método translate() , por ejemplo,

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

todo el componente, incluido el borde, se traduce. El efecto se presenta en la Figura 1.

El resultado deseado se representa en la figura a continuación.

El código está pegado a continuación.

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); } }


Ha invocado setBorder() en una instancia de GPanel y luego ha modificado la transformación del contexto de gráficos en la implementación de paintComponent() este último. El borde no lo sabe, por lo que el resultado que se muestra es totalmente esperado. En su lugar, siga las JComponent implementación de setBorder() para setBorder() : "ponga el componente en un JPanel y establezca el borde en el JPanel ". Un ejemplo relacionado se muestra aquí .

En la variación a continuación,

  • El bPanel ahora tiene el bPanel , y el gPanel adjunto puede manipular de forma segura el contexto de gráficos.

  • Antes de translate() , el punto rojo se centra en el origen; después de translate() , el punto azul se centra en el origen, pero el origen se ha movido.

  • No use setPreferredSize() cuando realmente getPreferredSize() anular getPreferredSize() .

  • No extienda JFrame innecesariamente.

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); } } }


prueba este código:

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