usar sirve setdefaultcloseoperation que por poner para minimizar maximizar eventos defecto como codigo java swing bezier jinternalframe jdesktoppane

java - sirve - CubicCurve2D conecta dos instancias de JInternalFrame



para que sirve jinternalframe en java (2)

Sí. Aquí hay un ejemplo usando drawLine(int x1, int y1, int x2, int y2) , pero invocar draw(Shape s) en su curva es una extensión directa. Es posible que tenga que expandir el ComponentAdapter de ComponentAdapter para manejar eventos de cambio de tamaño también.

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; /** @see http://stackoverflow.com/questions/3951383 */ public class JDPTest extends JDesktopPane { private static final Stroke s = new BasicStroke(4.0f); private MyFrame one = new MyFrame("One", 100, 100); private MyFrame two = new MyFrame("Two", 400, 240); public JDPTest() { this.setPreferredSize(new Dimension(640, 480)); this.add(one); this.add(two); } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.lightGray); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setColor(Color.blue); g2d.setStroke(s); int x1 = one.getX() + one.getWidth() / 2; int y1 = one.getY() + one.getHeight() / 2; int x2 = two.getX() + two.getWidth() / 2; int y2 = two.getY() + two.getHeight() / 2; g2d.drawLine(x1, y1, x2, y2); } private final class MyFrame extends JInternalFrame { MyFrame(String name, int x, int y) { super(name); this.setSize(160, 100); this.setLocation(x, y); this.setVisible(true); this.addComponentListener(new ComponentAdapter() { @Override public void componentMoved(ComponentEvent e) { JDPTest.this.repaint(); } }); } } private void display() { JFrame f = new JFrame("JDPTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new JDPTest().display(); } }); } }

He estado tratando de encontrar una forma (en Swing) para conectar dos JInternalFrame con un CubicCurve2D (también conocido como curva de bezier cúbica). El efecto general que intento lograr es una interfaz similar a Yahoo! Tuberías (la curva debe ir desde la parte inferior de un marco interno a la parte superior del otro).

¿Alguien ha hecho esto antes? El problema al que me estoy enfrentando es que no puedo entender cómo dibujar una curva de actualización de una manera visible para el usuario. Dibujar y volver a pintar JDesktopPane.getGraphics no parece hacer nada.

Si es posible, me gustaría utilizar un buffer fuera de pantalla.


Prueba esto. Acabo de modificar el código dado arriba.

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.geom.CubicCurve2D; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; /** @see http://.com/questions/3951383 */ public class JDPTest extends JDesktopPane { private static final Stroke s = new BasicStroke(4.0f); private MyFrame one = new MyFrame("One", 100, 100); private MyFrame two = new MyFrame("Two", 400, 240); CubicCurve2D cubcurve; public JDPTest() { this.setPreferredSize(new Dimension(640, 480)); this.add(one); this.add(two); } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.lightGray); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setColor(Color.blue); g2d.setStroke(s); int x1 = one.getX() + one.getWidth() / 2; int y1 = one.getY() + one.getHeight() / 2; int x2 = two.getX() + two.getWidth() / 2; int y2 = two.getY() + two.getHeight() / 2; cubcurve = new CubicCurve2D.Float(x1,y1,x1+200,y1-115,x2-200,y2+115,x2,y2); g2d.draw(cubcurve); // g2d.drawLine(x1, y1, x2, y2); } private final class MyFrame extends JInternalFrame { MyFrame(String name, int x, int y) { super(name); this.setSize(160, 100); this.setLocation(x, y); this.setVisible(true); this.addComponentListener(new ComponentAdapter() { @Override public void componentMoved(ComponentEvent e) { JDPTest.this.repaint(); } }); } } private void display() { JFrame f = new JFrame("JDPTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { new JDPTest().display(); } }); } }