まず、d3.js で書かれたこの素晴らしい例を見てみましょう: http://mbostock.github.io/d3/talk/20111018/partition.html
Javaのようなものをエミュレートしようとしています。私はあまり成功していません。GUI は作成できましたが、アニメーション化は難しいことがわかりました。いくつかのことをいじってうまくいかなかったので、いくつかのガイダンスが必要だと思います。
編集:問題を説明する方法がわかりませんが、試してみます。ネストされた JPanel をクリックすると、このパネルにフォーカスが置かれ、その中のコンテンツがウィンドウ全体に表示されるようになります。表示できる場合は、例に表示されているものとほとんど同じです。たとえば、「vis」というラベルの付いた青いブロックをクリックすると、このブロックはその下にあるすべてのコンテンツにフォーカスします。木によく似ていますが、アニメーション化されています。
説明どおりに機能するようにシステムを設計する方法に固執していると思います。問題にアプローチする方法についての戦略を探しています。より具体的に説明する必要がある場合はお知らせください。
package animation;
import java.awt.BorderLayout;
public class TestAnimation extends JFrame {
private boolean buttonActive = false;
private boolean boxActive = false;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestAnimation frame = new TestAnimation();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TestAnimation() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//this.setExtendedState(JFrame.MAXIMIZED_BOTH);
setBounds(100, 100, 450, 300);
getContentPane().setLayout(new BorderLayout());
ParentObj one = new ParentObj("Vblock", this);
}
}
インスタンス化される親オブジェクトのクラスは次のとおりです。
package animation;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
public class ParentObj extends JComponent{
public boolean isActive = false;
public final JFrame frame;
public Obj1 compute;
public Obj1 storage;
public String name;
public Obj1 test;
public ParentObj(String n, JFrame f){
this.frame = f;
this.name = n;
final JPanel panelL = new JPanel();
panelL.setBackground(Color.blue);
panelL.setLayout(new BorderLayout());
panelL.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
System.out.println(name);
//startAnimations(box);
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
JLabel title = new JLabel(name);
title.setForeground(Color.white);
title.setHorizontalAlignment(SwingConstants.CENTER);
panelL.add(title, BorderLayout.CENTER);
final JPanel panelR = new JPanel();
panelR.setLayout(new GridLayout(0, 1, 0, 0));
panelR.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
System.out.println(name);
//startAnimations(box);
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
final JSplitPane panel = new JSplitPane(1, true, panelL, panelR);
panel.setDividerSize(0);
panel.setResizeWeight(0.3);
panel.setBorder(null);
panel.setBorder(new LineBorder(new Color(0, 0, 0)));
frame.add(panel, BorderLayout.CENTER);
compute = new Obj1("Compute", frame ,panelR);
storage = new Obj1("Storage", frame, panelR);
test = new Obj1("Network", frame, panelR);
}
}
そして最後に、個々のピースの小さなクラス:
package animation;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JSplitPane;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
public class Obj1 extends JComponent{
public String name;
public JComponent parent;
public JFrame frame;
final JSplitPane panel;
public Obj1(String n, JFrame f, JComponent p) {
this.name = n;
this.parent = p;
this.frame = f;
final JPanel panelL = new JPanel();
panelL.setBackground(Color.blue);
panelL.setLayout(new BorderLayout());
panelL.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
System.out.println(name);
startAnimations();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
JLabel title = new JLabel(name);
title.setForeground(Color.white);
title.setHorizontalAlignment(SwingConstants.CENTER);
panelL.add(title, BorderLayout.CENTER);
final JPanel panelR = new JPanel();
panelR.setLayout(new GridLayout(0, 1, 0, 0));
panelR.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
System.out.println(name);
//startAnimations(box);
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
panel = new JSplitPane(1, true, panelL, panelR);
panel.setDividerSize(0);
panel.setResizeWeight(0.3);
panel.setBorder(new LineBorder(new Color(0, 0, 0)));
p.add(panel, BorderLayout.CENTER);
}
public void startAnimations(){
//panel.setSize(frame.getWidth(), frame.getHeight());
///JRootPane test = panel.getRootPane();
}
}
正しい結果を生成する方法について何か提案がある場合、またはこの問題にアプローチする別の方法がある場合はお知らせください。どうもありがとうございました!