Java 显示JPanel以构建另一个类
我有一个主JFrame和三个java类,其中包含不同的饼图,这些饼图在面板中。我想调用主jframe中的三个pie类。我怎么能做到 //我有三个图表类在面板中创建不同的图表Java 显示JPanel以构建另一个类,java,swing,layout-manager,Java,Swing,Layout Manager,我有一个主JFrame和三个java类,其中包含不同的饼图,这些饼图在面板中。我想调用主jframe中的三个pie类。我怎么能做到 //我有三个图表类在面板中创建不同的图表 public class PiePanel extends Observer { Singleton connCC = Singleton.getInstance(); Connection con = null; Statement stm = null; PiePanel(Subject s) { panel = n
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;
}
}
现在我想在另一个JFrame类中传递这个列表,就像图中一样 您的问题是,您正在以默认方式向使用BorderLayout的容器中添加三个组件,这会导致BorderLayout.CENTER中添加的每个组件覆盖以前添加的所有其他组件。如果要显示三个组件,可以:
- 使用BorderLayout常量可使用容器将组件添加到BorderLayout中的不同位置,或
- 使用不同的布局,这里可能是GridLayout(3,1),或者
- 如果您想要一个显示更多组件的更复杂的GUI,那么嵌套JPanel,每个都使用自己的布局管理器。
- 例如,如果您想将饼图显示在一侧,那么我会将它们放入使用GridLayout的JPanel中,然后使用BorderLayout.LINE_END位置中的主GUI或您想要的任何位置,将使用JPanel的GridLayout添加到BorderLayout中
另一方面,如果您的目标是为了响应事件而将一个JPanel换成另一个JPanel,那么使用CardLayout可以轻松高效地交换组件。为每个Pie对象使用JFrame类中的setter。你可以这样做。从中添加(饼)method@Meli你的问题到底是什么?您是否在询问如何将列表的同一实例传递到不同的类中,以便所有类共享相同的数据?只想在JFrame类中传递列表的实例谢谢您的回答,不,我不打算交换,我只需要在主框架中显示饼图。@Meli:然后使用更合适的布局管理器。例如,如果您想将饼图显示在一侧,那么我会将它们放入使用GridLayout的JPanel中,然后使用BorderLayout.LINE_END位置的主GUI将使用JPanel的GridLayout添加到BorderLayout中,或者添加到您想要的任何位置。我在问题中做了一些更改,以使其更清楚。谢谢again@Meli当前位置我的答案仍然有效。关于这个答案,你还有什么问题吗?是的。我已经将这三类面板放入了一个列表中,但我仍然不清楚如何将其传递给框架?
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);
}
}
}