【问题标题】:Drawing a graph using jlabel / jpanel使用 jlabel / jpanel 绘制图形
【发布时间】:2017-01-10 15:49:50
【问题描述】:

我正在使用 java swing 构建一个算法可视化工具,我想将 jlabel 的高度设置为某个元素

int arr[]={6,3,2,13,4};
then
JLabel1.setSize(10, arr[0]*5);
JLabel2.setSize(10, arr[1]*5);
JLabel3.setSize(10, arr[2]*5);
JLabel4.setSize(10, arr[3]*5);
JLabel5.setSize(10, arr[4]*5);

但是当我设置尺寸时,标签扩展到底部,形成一个倒置的条形图。如何在保持 jLabels 底部对齐的同时增加高度?

The output after setting the values to jlabel

设置值的源代码

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
      abc = new JLabel[]{one,two,three,four,five}; //JlabelArray

      int p = Integer.parseInt(abc[0].getText());
      int q = Integer.parseInt(abc[1].getText());
      int r = Integer.parseInt(abc[2].getText());
      int s = Integer.parseInt(abc[3].getText());
      int t = Integer.parseInt(abc[4].getText());



      one.setSize(20, p*10 );
      one.setBackground(Color.decode("#03A9F4"));
      two.setSize(20, q*10 );
      two.setBackground(Color.decode("#03A9F4"));
      three.setSize(20, r*10 );
      three.setBackground(Color.decode("#03A9F4"));
      four.setSize(20, s*10 );
      four.setBackground(Color.decode("#03A9F4"));
      five.setSize(20, t*10 );
      five.setBackground(Color.decode("#03A9F4"));

      arr = new int[]{p,q,r,s,t}; //number array to be sorted

    }

夏天 问:当我设置 jLabel 的大小时,通常它会向底部增长。如何增加正 y 方向的高度?

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。
  • 请同时发布确定标签位置的代码部分。
  • Draw a Graph 不确定是否使用像这样的单独组件是最好的方法 - 考虑使用单个 JPanel 并使用 custom painting。或者使用图形库(例如JFreeChart
  • @Berger "请发布您的代码的部分.." 根据定义,MCVE 包括 所有我们编译它并看到问题的必要部分,所以真的没有'也'。
  • @rama41222 I'm going to sort (animate ) 更有动力去研究自定义绘画选项。

标签: java swing alignment jlabel


【解决方案1】:

在您要添加 JLabels 的面板上使用不同的布局管理器 - 我建议使用 GridBagLayout。把它做好是一件痛苦的事,但是一旦你理解了它,它就可以非常灵活地布置组件。对于你的,我会尝试:

JPanel pane = new JPanel(new GridBagLayout());

GridBagConstants c = new GridBagConstants;

c.gridheight = REMAINDER;
c.gridwidth  = 1;
c.fill       = NONE;
c.anchor     = SOUTHWEST;
c.weightx    = 1;
c.weighty    = 0;

pane.add(label1, c);
pane.add(label2, c);
pane.add(label3, c);

c.gridwidth = RELATIVE;

pane.add(label4, c);

c.gridwidth = REMAINDER;

pane.add(label5, c);

【讨论】:

    【解决方案2】:

    除了不同的 LayoutManager 之外的另一个选项是根本没有 LayoutManager (JPanel.setLayout(null))。这样,面板的任何子组件都不会自动调整大小/移动,您必须自己定位和调整它们的大小。这适用于固定大小的容器。这样的解决方案看起来像:

    pane.setLayout(null);
    
    pane.add(label1);
    label1.setBounds(label1X, label1Y, label1Width, label1Height);
    

    请注意,这也意味着组件不会响应其容器的大小变化 - 如果需要,(可能是自定义的)LayoutManager 是更好的选择。

    【讨论】:

    • “除了不同的 LayoutManager 之外,另一个选项根本没有 LayoutManager ..” 当然这是一个选项,但不应该向新手推荐。在您了解原因之前,请停止提供布局建议。当新手有足够的技能来布局 GUI 时,他们通常可以将该逻辑放入自定义布局管理器中。
    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多