java - JTextField水平滚动java swing

标签 java swing scrollbar jtextfield horizontal-scrolling

我在 JPanel 中有一个 JTextField 。用户可以在文本字段中输入任意大小的文本,但是当文本超出文本字段的屏幕时,应该出现水平滚动。此时,如果用户退格文本并缩小文本字段屏幕内的文本,则滚动应该消失。所以基本上滚动应该只在需要时出现。怎么做 ?请帮忙。

最佳答案

如果您不喜欢 JScrollPane + JTextField 的行为,则需要使用 JScrollBar#setModel(BoundedRangeModel) + JTextField#getHorizontalVisibility() :

screenshot

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicScrollBarUI;

public class TextFieldScrollBarTest {
  private static final String TEXT = "javascript:(function(){var l=location,m=l.href.match('^(https?://)(.+)(api[^+]+|technotes[^+]+)');if(m)l.href=m[1]+'docs.oracle.com/javase/8/docs/'+decodeURIComponent(m[3]).replace(/\\+.*$/,'').replace(/\\[\\]/g,':A').replace(/, |\\(|\\)/g,'-');}());";

  public JComponent makeUI() {
    JScrollPane scroll = new JScrollPane(new JTextField(TEXT));
    scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

    JTextField textField = new JTextField(TEXT);
    JScrollBar scroller = new JScrollBar(Adjustable.HORIZONTAL) {
      @Override public void updateUI() {
        //super.updateUI();
        setUI(new ArrowButtonlessScrollBarUI());
      }
      @Override public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        d.height = 5;
        return d;
      }
    };
    scroller.setModel(textField.getHorizontalVisibility());

    Box box = Box.createVerticalBox();
    box.add(scroll);
    box.add(Box.createVerticalStrut(50));
    box.add(textField);
    box.add(Box.createVerticalStrut(2));
    box.add(scroller);
    box.add(Box.createVerticalGlue());

    JPanel p = new JPanel(new BorderLayout());
    p.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    p.add(box, BorderLayout.NORTH);
    return p;
  }

  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new TextFieldScrollBarTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

class ZeroSizeButton extends JButton {
  private static final Dimension ZERO_SIZE = new Dimension();
  @Override public Dimension getPreferredSize() {
    return ZERO_SIZE;
  }
}

class ArrowButtonlessScrollBarUI extends BasicScrollBarUI {
  private static final Color DEFAULT_COLOR  = new Color(220, 100, 100);
  private static final Color DRAGGING_COLOR = new Color(200, 100, 100);
  private static final Color ROLLOVER_COLOR = new Color(255, 120, 100);
  @Override protected JButton createDecreaseButton(int orientation) {
    return new ZeroSizeButton();
  }
  @Override protected JButton createIncreaseButton(int orientation) {
    return new ZeroSizeButton();
  }
  @Override protected void paintTrack(Graphics g, JComponent c, Rectangle r) {
    //Graphics2D g2 = (Graphics2D) g.create();
    //g2.setPaint(new Color(100, 100, 100));
    //g2.fillRect(r.x, r.y, r.width - 1, r.height - 1);
    //g2.dispose();
  }
  @Override protected void paintThumb(Graphics g, JComponent c, Rectangle r) {
    JScrollBar sb = (JScrollBar) c;
    if (!sb.isEnabled()) {
      return;
    }
    BoundedRangeModel m = sb.getModel();
    int iv = m.getMaximum() - m.getMinimum() - m.getExtent() - 1; // -1: bug?
    if (iv > 0) {
      Graphics2D g2 = (Graphics2D) g.create();
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      Color color;
      if (isDragging) {
        color = DRAGGING_COLOR;
      } else if (isThumbRollover()) {
        color = ROLLOVER_COLOR;
      } else {
        color = DEFAULT_COLOR;
      }
      g2.setPaint(color);
      g2.fillRect(r.x, r.y, r.width - 1, r.height - 1);
      g2.dispose();
    }
  }
}

关于java - JTextField水平滚动java swing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860613/

相关文章:

java - 单击按钮后在弹出窗口中显示图像 - Android/Java

java - Pentaho 通过命令行运行作业

java - new ArrayList<Set<?>>() - 为什么可以?

java - 找不到方法 setModal(boolean)

java - 文本字段未以正确的大小显示

html - 出现空滚动条,没有溢出

java - IntelliJ IDEA : How to import a project that has Java and JavaScript modules?

java - 如何在不耗尽内存的情况下持续更新JTable?

python - 如何在 Tkinter 中创建带滚动条的 LabelFrame?

jquery - jquery 移动应用程序中滚动条不可见