将JPanel显示给JFrame另一个类

时间:2016-02-27 16:08:39

标签: java swing layout-manager

我有一个主JFrame和三个包含不同饼图的java类,这些饼图在面板中。我想调用主jframe中的三个饼图类。我该怎么做?implementation

//我有三个图表类在面板中创建不同的图表

public class PiePanel extends Observer {

Singleton connCC = Singleton.getInstance();
Connection con = null;
Statement stm = null;

PiePanel(Subject s) {
panel = new JPanel();
sub = s;
}

@Override
public void update() {
try {
    con = connCC.getDBconnection();
    stm = con.createStatement();
    ResultSet rs = stm.executeQuery("Select pet_name as pet,     count(pet_ID) AS 'count' from Pet group by pet_name");
    DefaultPieDataset dataset = new DefaultPieDataset();
    while (rs.next()) {
        dataset.setValue(rs.getString("pet"), Integer.parseInt(rs.getString("count")));
    }

    JFreeChart pieChart = ChartFactory.createPieChart("Header", dataset, true, true, false);
    PiePlot plot = (PiePlot) pieChart.getPlot();
    plot.setSimpleLabels(true);

    PieSectionLabelGenerator gen = new StandardPieSectionLabelGenerator(
            "{0}: {1} ({2})", new DecimalFormat("0"), new DecimalFormat("0%"));
    plot.setLabelGenerator(gen);

    panel.add(new ChartPanel(pieChart) {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(335, 235);
        }
    });

    panel.validate();
} catch (Exception e) {
    JOptionPane.showMessageDialog(null, e);
}

}

//下面是一个将所有面板放在列表中的类

 public class Subject {
private List<Observer> panel = new ArrayList<Observer>();
public Subject(){
   panel.add(new BarPanel(this));
   panel.add(new AreaPanel(this));
   panel.add(new PiePanel(this));
}
public List<Observer> getChart(){
      return panel;
}

}

//主

public class Main {

public static void main(String[] args) {

    Subject s = new Subject();

    while (true) {
        String input = JOptionPane.showInputDialog(null, "Input value:");
        if ("d".equals(input) || "w".equals(input)) {
            try {
                //String value = Integer.parseInt(input);
                s.setState(input);
            } catch (Exception e) {
                System.exit(0);
            }
        } else {
            System.out.println("Wrong Input!");
            System.exit(0);
        }

    }
}

}

现在我想在另一个JFrame类中传递此列表,就像在图片中一样。

1 个答案:

答案 0 :(得分:3)

您的问题是您以默认方式将三个组件添加到使用BorderLayout的容器中,这会导致BorderLayout.CENTER中的每个添加组件覆盖之前添加的所有其他组件。如果要显示三个组件,您可以:

  • 使用BorderLayout常量将组件添加到BorderLayout使用容器中的不同位置,或
  • 使用不同的布局,这里可能是GridLayout(3,1)或
  • 如果你想要一个更复杂的GUI来显示更多组件,那么嵌套JPanels,每个都使用自己的布局管理器。
    • 例如,如果要将饼图显示在一边,那么我将它们放入使用GridLayout的JPanel中,然后使用JPanel将该GridLayout添加到BorderLayout-使用主GUI在BorderLayout.LINE_END位置,或您想要的任何位置。

另一方面,如果您的目标是将一个JPanel替换为另一个JPanel以响应事件,那么使用CardLayout可以轻松高效地交换组件。