Java JFreeChart隐藏在另一个后面

Java JFreeChart隐藏在另一个后面,java,swing,intellij-idea,jfreechart,Java,Swing,Intellij Idea,Jfreechart,我试图在IntelliJ中构建UI,但这很难,所以我尝试在Eclipse中构建它。现在UI看起来稍微好一点,但仍然很差。图中的一个(塞纳一号)应该更大,南部的第二个应该更小,但平坦而长。我试着使用预先指定的大小或验证或重新绘制,但仍然一无所获。如何将它们锚定在侧边边界上,并避免自己覆盖它们 public class MainWindow extends JFrame{ private JPanel contentPane; private XYSeries daneXYSciezki; pr

我试图在IntelliJ中构建UI,但这很难,所以我尝试在Eclipse中构建它。现在UI看起来稍微好一点,但仍然很差。图中的一个(塞纳一号)应该更大,南部的第二个应该更小,但平坦而长。我试着使用预先指定的大小或验证或重新绘制,但仍然一无所获。如何将它们锚定在侧边边界上,并避免自己覆盖它们

public class MainWindow extends JFrame{

private JPanel contentPane;

private XYSeries daneXYSciezki;
private XYSeries daneXYWys;

private final XYSeriesCollection wykCenter;
private final XYSeriesCollection wykSouth;

public MainWindow(){
   setTitle("ParserGPS");
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setBounds(100, 100, 880, 640);
   contentPane = new JPanel();
   contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
   setContentPane(contentPane);
   contentPane.setLayout(new BorderLayout(0, 0));

   JPanel panelNorth = new JPanel();
   FlowLayout flowLayout = (FlowLayout) panelNorth.getLayout();
   flowLayout.setAlignment(FlowLayout.LEFT);
   contentPane.add(panelNorth, BorderLayout.NORTH);

   JButton btnWczytajPlik = new JButton("Wczytaj plik");
   panelNorth.add(btnWczytajPlik);

   JLabel lblOdlego = new JLabel("Odległość:");
   panelNorth.add(lblOdlego);

   JLabel lblm = new JLabel("0m");
   panelNorth.add(lblm);

   JLabel lblCzas = new JLabel("Czas:");
   panelNorth.add(lblCzas);

   JLabel label = new JLabel("00:00:00");
   panelNorth.add(label);

   JLabel lblPrdko = new JLabel("Prędkość:");
   panelNorth.add(lblPrdko);

   JLabel lblkmh = new JLabel("0km/h");
   panelNorth.add(lblkmh);

   JLabel lblNrSat = new JLabel("Nr sat:");
   panelNorth.add(lblNrSat);

   JLabel label_1 = new JLabel("0");
   panelNorth.add(label_1);

   JLabel lblGga = new JLabel("GGA:");
   lblGga.setHorizontalAlignment(SwingConstants.CENTER);
   panelNorth.add(lblGga);

   JLabel label_2 = new JLabel("0/0");
   panelNorth.add(label_2);

   JLabel lblGsa = new JLabel("GSA:");
   panelNorth.add(lblGsa);

   JLabel label_3 = new JLabel("0/0");
   panelNorth.add(label_3);

   JLabel lblNewLabel = new JLabel("RMC:");
   panelNorth.add(lblNewLabel);

   JLabel label_4 = new JLabel("0/0");
   panelNorth.add(label_4);

   JLabel lblGll = new JLabel("GLL:");
   panelNorth.add(lblGll);

   JLabel label_5 = new JLabel("0/0");
   panelNorth.add(label_5);

   JLabel lblVtg = new JLabel("VTG:");
   panelNorth.add(lblVtg);

   JLabel label_6 = new JLabel("0/0");
   panelNorth.add(label_6);

   JPanel jpCenter = new JPanel();
   contentPane.add(jpCenter, BorderLayout.CENTER);
   jpCenter.setPreferredSize(new Dimension(785, 440));

   JPanel jpSouth = new JPanel();
   FlowLayout flowLayout_1 = (FlowLayout) jpSouth.getLayout();
   flowLayout_1.setAlignment(FlowLayout.TRAILING);
   contentPane.add(jpSouth, BorderLayout.SOUTH);

   this.daneXYSciezki = new XYSeries("Trasa", false);
   wykCenter = new XYSeriesCollection(this.daneXYSciezki);
   final JFreeChart jfcWykCenter = createChart(wykCenter);
   final ChartPanel jfcPanelCenter = new ChartPanel(jfcWykCenter);
   jpCenter.add(jfcPanelCenter,BorderLayout.CENTER);

   this.daneXYSciezki = new XYSeries("Wysokość", false);
   wykSouth = new XYSeriesCollection(this.daneXYSciezki);
   final JFreeChart jfcWykSouth = createChart(wykSouth);
   final ChartPanel jfcPanelSouth = new ChartPanel(jfcWykSouth);
   jpSouth.add(jfcPanelSouth,BorderLayout.CENTER);
   repaint();
   revalidate();
    }

    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createXYLineChart(
                "",
                "Szerokość",
                "Długość",
                dataset);
        final XYPlot plot = result.getXYPlot();
        NumberAxis yAxis = (NumberAxis) plot.getRangeAxis();
        yAxis.setAutoRangeIncludesZero(false);
        yAxis.setAutoRange(true);
        customizeChart(result);
        return result;
    }

    private void customizeChart(JFreeChart chart) {
        XYPlot plot = chart.getXYPlot();
        XYLineAndShapeRenderer renderer;
        renderer = new XYLineAndShapeRenderer(true, true);
        renderer.setSeriesShapesVisible(0, true);
        renderer.setSeriesShapesVisible(1, false);
        renderer.setSeriesPaint(0, Color.RED);
        renderer.setSeriesStroke(0, new BasicStroke(1.0f));
        plot.setRenderer(renderer);
        plot.setBackgroundPaint(Color.WHITE);
        plot.setRangeGridlinesVisible(true);
        plot.setRangeGridlinePaint(Color.BLACK);
        plot.setDomainGridlinesVisible(true);
        plot.setDomainGridlinePaint(Color.BLACK);
    }
}

在@m.cekiera通知之后

public class MainWindow extends JFrame{
private JPanel contentPane;

private XYSeries daneXYSciezki;
private XYSeries daneXYWys;

private final XYSeriesCollection wykCenter;
private final XYSeriesCollection wykSouth;

public MainWindow(){
    setTitle("ParserGPS");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 880, 640);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new BorderLayout(0, 0));

    JPanel panelNorth = new JPanel();
    FlowLayout flowLayout = (FlowLayout) panelNorth.getLayout();
    flowLayout.setAlignment(FlowLayout.LEFT);
    contentPane.add(panelNorth,BorderLayout.NORTH);

    JButton btnWczytajPlik = new JButton("Wczytaj plik");
    panelNorth.add(btnWczytajPlik);

    JLabel lblOdlego = new JLabel("Odległość:");
    panelNorth.add(lblOdlego);

    JLabel lblm = new JLabel("0m");
    panelNorth.add(lblm);

    JLabel lblCzas = new JLabel("Czas:");
    panelNorth.add(lblCzas);

    JLabel label = new JLabel("00:00:00");
    panelNorth.add(label);

    JLabel lblPrdko = new JLabel("Prędkość:");
    panelNorth.add(lblPrdko);

    JLabel lblkmh = new JLabel("0km/h");
    panelNorth.add(lblkmh);

    JLabel lblNrSat = new JLabel("Nr sat:");
    panelNorth.add(lblNrSat);

    JLabel label_1 = new JLabel("0");
    panelNorth.add(label_1);

    JLabel lblGga = new JLabel("GGA:");
    //lblGga.setHorizontalAlignment(SwingConstants.CENTER);
    panelNorth.add(lblGga);

    JLabel label_2 = new JLabel("0/0");
    panelNorth.add(label_2);

    JLabel lblGsa = new JLabel("GSA:");
    panelNorth.add(lblGsa);

    JLabel label_3 = new JLabel("0/0");
    panelNorth.add(label_3);

    JLabel lblNewLabel = new JLabel("RMC:");
    panelNorth.add(lblNewLabel);

    JLabel label_4 = new JLabel("0/0");
    panelNorth.add(label_4);

    JLabel lblGll = new JLabel("GLL:");
    panelNorth.add(lblGll);

    JLabel label_5 = new JLabel("0/0");
    panelNorth.add(label_5);

    JLabel lblVtg = new JLabel("VTG:");
    panelNorth.add(lblVtg);

    JLabel label_6 = new JLabel("0/0");
    panelNorth.add(label_6);

    JPanel jpCenter = new JPanel(new BorderLayout());
    contentPane.add(jpCenter, BorderLayout.CENTER);
    //jpCenter.setPreferredSize(new Dimension(785, 440));

    JPanel jpSouth = new JPanel(new BorderLayout());
    //FlowLayout flowLayout_1 = (FlowLayout) jpSouth.getLayout();
   // flowLayout_1.setAlignment(FlowLayout.TRAILING);
    contentPane.add(jpSouth, BorderLayout.SOUTH);

    this.daneXYSciezki = new XYSeries("Trasa", false);
    wykCenter = new XYSeriesCollection(this.daneXYSciezki);
    final JFreeChart jfcWykCenter = createChart(wykCenter);
    final ChartPanel jfcPanelCenter = new ChartPanel(jfcWykCenter);
    jpCenter.add(jfcPanelCenter,BorderLayout.NORTH);

    this.daneXYSciezki = new XYSeries("Wysokość", false);
    wykSouth = new XYSeriesCollection(this.daneXYSciezki);
    final JFreeChart jfcWykSouth = createChart(wykSouth);
    final ChartPanel jfcPanelSouth = new ChartPanel(jfcWykSouth);
    jpCenter.add(jfcPanelSouth,BorderLayout.SOUTH);
    }

...
}

由于您的代码不正确,我无法对其进行更改,但我认为您的问题在于布局设置不正确。例如,创建一个新的
JPanel

JPanel jpSouth = new JPanel();
FlowLayout flowLayout_1 = (FlowLayout) jpSouth.getLayout();
flowLayout_1.setAlignment(FlowLayout.TRAILING);
您知道它正在使用defaul提供的
FlowLayout
,稍后您将使用:

jpSouth.add(jfcPanelSouth,BorderLayout.CENTER);
但您永远不会将布局更改为
边框布局
。不能混合一个特定容器的布局。但这并不是你直接遇到的问题

您的
BorderLayout.SOUTH
区域水平延伸,以适应内部组件,
BorderLayout.CENTER
将所有规格都保留(或不保留)。这就是
BorderLayout
的这些部分的工作原理。所以您可以更改放置特定组件的位置,或者根本更改布局

我建议尝试:

JPanel jpCenter = new JPanel(new BorderLayout());
...
jpCenter.add(jfcPanelCenter,BorderLayout.NORTH);
...
jpCenter.add(jfcPanelSouth,BorderLayout.SOUTH); //not to contentPane!
这将改变一种安排。但是我不确定,这是你想要的吗。如果没有,请尝试使用不同的布局,例如
BoxLayout
。 此外,我宁愿使用
pack()
设置组件的大小,也不愿在计数器上使用
setBounds


如果您想创建GUI,但不关心如何创建,也可以使用GUI构建器,如Netbeans IDE GUI构建器。

您的建议非常有用。在我加入你的建议后,我很快就能解决我的问题了。只有一件事我不明白。为什么现在中面板宽而平,南面板更大。我希望南面板宽而平,中间面板大而主chart@GarryMoveOut我认为这是和以前一样的问题,您仍然将
jpCenter
添加到
contentPane
center,因此它将更改大小以适应左边的规格。然后将
jpSouth
添加到contentPane的南部,使其再次垂直扩展。试着把这两个位置都放进去:
jfcPanelCenter
放在北方位置,
jfcPanelSouth
放在
jpCenter的边界布局的南方位置。
。我按照您的建议更正代码。差不多好了。但是一些jfcPanelSouth
落后于
jfcPalenCenter
@GarryMoveOut可能会尝试使用JFrame.pack()