【问题标题】:JLabel disappears after scrollingJLabel 滚动后消失
【发布时间】:2014-02-17 15:49:33
【问题描述】:

我有一个包含ImageIcon 的滚动面板。我想在 px 中添加绝对位置的JLabel。我有什么:

代码:

public class HelloWorld {


    HelloWorld() {

        JFrame jfrm = new JFrame("Hello, World!");
        jfrm.setSize(640, 480);
        JPanel mapPanel = new JPanel();
        mapPanel.setLayout(null);
        mapPanel.setSize(600,400);
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ImageIcon imageIcon = new ImageIcon("src\\SwingExp\\img\\map.gif");
        JScrollPane scrollPane = new JScrollPane(new JLabel(imageIcon));
        scrollPane.setBounds(5,5,600,400);
        JLabel usaLabel = new JLabel("U.S.A.");
        usaLabel.setBounds(210,200,50,25);
        mapPanel.add(usaLabel);
        mapPanel.add(scrollPane);

        jfrm.add(mapPanel);
        jfrm.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new HelloWorld();
            }
        });
    }
}

但如果我稍微滚动一下,美国标签将从地图上消失:

JLabel 位置必须是绝对的,如您所见。如何避免这种情况?

【问题讨论】:

    标签: java swing layout jscrollpane jlabel


    【解决方案1】:

    usaLabel 添加到包含图标的标签,而不是滚动窗格:

    ImageIcon imageIcon = new ImageIcon("src\\SwingExp\\img\\map.gif");
    JLabel map = new JLabel( imageIcon );
    JScrollPane scrollPane = new JScrollPane( map );
    //JScrollPane scrollPane = new JScrollPane(new JLabel(imageIcon));
    scrollPane.setBounds(5,5,600,400);
    JLabel usaLabel = new JLabel("U.S.A.");
    usaLabel.setBounds(210,200,50,25);
    map.add( usaLabel );
    //mapPanel.add(usaLabel);
    

    同时停止在任何地方使用空布局。不需要您的 mapPanel 变量。只需将滚动窗格直接添加到框架的内容窗格即可。默认情况下,滚动窗格将被添加到 CENTER 并占用框架中的所有可用空间。

    【讨论】:

      【解决方案2】:

      我提供这个作为替代答案:

      • 它使用EmptyBorder 表示白色(OK 蓝色)空间
      • 滚动窗格返回按宽度因子缩放的首选大小。
      • 滚动到结尾,然后无缝重新开始。
      • 由于 GUI 显示一个“图像宽度”,因此始终可以看到美国(澳大利亚、新西兰和 ..其他所有地方)。 ;)

      源图像是为this answer 创建的。

      代码

      import java.awt.*;
      import java.awt.event.*;
      import java.awt.image.BufferedImage;
      import javax.swing.*;
      import javax.swing.border.EmptyBorder;
      import java.net.*;
      import javax.imageio.ImageIO;
      
      class HelloScrollingWorld {
      
          public JPanel gui = new JPanel(new BorderLayout());
          JScrollPane scrollPane;
          Timer timer = null;
          /**
           * The number of images we tile horizontally, must be >1 for scroll bar
           */
          int width = 2;
          /**
           * The equator (drawn in pale gray) is 44 px south of the vertical
           * center of the image.
           */
          int offset = 44;
          /**
           * Use this as padding on top and bottom.
           */
          int pad = 15;
      
          HelloScrollingWorld() {
              try {
                  URL worldImage = new URL("http://i.stack.imgur.com/OEGTq.png");
                  BufferedImage img = ImageIO.read(worldImage);
                  initComponents(img);
              } catch (Exception ex) {
                  ex.printStackTrace();
              }
          }
      
          private final void initComponents(final BufferedImage image) {
              JPanel multiimage = new JPanel(new GridLayout(1, 0, 0, 0));
              for (int ii = 0; ii < width; ii++) {
                  multiimage.add(new JLabel(new ImageIcon(image)));
              }
              multiimage.setBackground(Color.BLUE.brighter());
              // add the white (or bright blue) space.
              multiimage.setBorder(new EmptyBorder(pad, 0, pad + offset, 0));
              scrollPane = new JScrollPane(
                      multiimage,
                      JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                      JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS) {
      
                  /**
                   * return the preferred size scaled by the width.
                   */
                  @Override
                  public Dimension getPreferredSize() {
                      Dimension d = super.getPreferredSize();
      
                      return new Dimension(d.width / width, d.height);
                  }
              };
              gui.add(scrollPane, BorderLayout.CENTER);
              ActionListener scrollListener = new ActionListener() {
      
                  @Override
                  public void actionPerformed(ActionEvent e) {
                      scrollGui();
                  }
              };
              timer = new Timer(15, scrollListener);
              timer.start();
          }
      
          public void stopTimer() {
              timer.stop();
          }
      
          public void scrollGui() {
              JScrollBar scrollBar = scrollPane.getHorizontalScrollBar();
              BoundedRangeModel model = scrollBar.getModel();
              int max = model.getMaximum() - scrollBar.getVisibleAmount();
              int now = model.getValue();
              if (now < max) {
                  model.setValue(now + 1);
              } else {
                  model.setValue(1);
              }
          }
      
          public JComponent getGui() {
              return gui;
          }
      
          public static void main(String[] args) {
              Runnable r = new Runnable() {
      
                  @Override
                  public void run() {
                      HelloScrollingWorld hsw = new HelloScrollingWorld();
      
                      JOptionPane.showMessageDialog(
                              null,
                              hsw.getGui(),
                              "Hello Scrolling Padded World",
                              JOptionPane.INFORMATION_MESSAGE);
      
                      hsw.stopTimer();
                  }
              };
              // Swing GUIs should be created and updated on the EDT
              // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
              SwingUtilities.invokeLater(r);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多