【问题标题】:allowing users to "draw" and resize JTextArea允许用户“绘制”并调整 JTextArea 的大小
【发布时间】:2011-07-21 03:23:55
【问题描述】:

我想让用户能够用鼠标“绘制”(单击并拖动)来创建 JTextArea 并调整其大小。同样,我希望文本区域可以调整大小。

类似这样的:

想到了,但作为一个 JTextArea 而不仅仅是一个正方形。

Java 中有什么东西可以让我轻松做到这一点吗?我首先想到的是允许用户绘制一个矩形并获取坐标和大小来创建 JTextArea。我不确定如何调整大小。

编辑:“Component Resizer / Reszing”是我一直在寻找的术语,我在这里添加它以防其他人正在寻找类似的东西!

【问题讨论】:

  • “我希望用户能够用鼠标“绘制”(单击并拖动)来创建和调整 JTextArea 的大小。” 这是用于拖动吗? n'Drop Java GUI 编辑器?地球上已经有太多这样的人了。
  • 它将成为拼贴制作环境中的一个组件!我想看看这些 Drag'n'Drop 编辑器,有什么喜欢的吗?看到不太好的也很有趣!
  • “它将成为拼贴制作环境中的一个组件!” 好吧,这完全不是我的想法!拼贴制造商是“应用程序世界”(应用程序世界 - 我当场做出来的,你能说出来吗?)有什么喜欢的吗?” 不。不,我没有。 “看到不太好的也很有趣!” Netbeans 有一个,并且有 Eclipse、AFAIU 的插件,但我怀疑它们中的任何一个的代码对你在做什么。

标签: java swing resize jtextarea


【解决方案1】:

您可以找到解决方案here 我已经尝试过了,结果非常好。在本教程中有对另一个实现 here 的引用。

【讨论】:

    【解决方案2】:

    调整 JTextArea 的大小可以很容易地通过调用 setBounds(...) 来完成——或者在持有它的 JScrollPane 上更好,但你需要在容器上使用 null 或类似的 (JLayeredPane) 布局包含 JTextArea 并且在调整 JScrollPane 的大小后可能需要重新绘制容器。您还必须重新验证滚动窗格的视口,以便重新布局它所拥有的文本区域。

    例如,

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class ResizeableTextArea extends JPanel {
       private static final int PREF_WIDTH = 700;
       private static final int PREF_HEIGHT = 500;
       private static final int ROWS = 60;
       private static final int COLS = 80;
       private static final Color RECT_COLOR = new Color(180, 180, 255);
    
       private JTextArea textArea = new JTextArea(ROWS, COLS);
       private JScrollPane scrollPane = new JScrollPane(textArea);
       private int x, y, width, height;
       private boolean drawRect = false;
    
       public ResizeableTextArea() {
          setLayout(null);
          add(scrollPane);
    
          MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
          addMouseListener(myMouseAdapter);
          addMouseMotionListener(myMouseAdapter);
       }
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          if (drawRect) {
             g.setColor(RECT_COLOR);
             g.drawRect(x, y, width, height);         
          }
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_WIDTH, PREF_HEIGHT);
       }
    
       private class MyMouseAdapter extends MouseAdapter {
          private int innerX, innerY;
    
          @Override
          public void mousePressed(MouseEvent e) {
             x = e.getX();
             y = e.getY();
             innerX = x;
             innerY = y;
             width = 0;
             height = 0;
             drawRect = true;
          }
    
          @Override
          public void mouseDragged(MouseEvent e) {
             calcBounds(e);
    
             drawRect = true;
             ResizeableTextArea.this.repaint();
          }
    
          @Override
          public void mouseReleased(MouseEvent e) {
             calcBounds(e);
    
             drawRect = false;
             scrollPane.setBounds(x, y, width, height);
             scrollPane.getViewport().revalidate();
             ResizeableTextArea.this.repaint();
    
          }
    
          private void calcBounds(MouseEvent e) {
             width = Math.abs(innerX - e.getX());
             height = Math.abs(innerY - e.getY());
             x = Math.min(innerX, e.getX());
             y = Math.min(innerY, e.getY());
          }
    
       }
    
       private static void createAndShowUI() {
          JFrame frame = new JFrame("ResizeableTextArea");
          frame.getContentPane().add(new ResizeableTextArea());
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          java.awt.EventQueue.invokeLater(new Runnable() {
             public void run() {
                createAndShowUI();
             }
          });
       }
    }
    

    【讨论】:

    • 谢谢!这非常有帮助,正是我一直在寻找的绘图部分!
    【解决方案3】:

    您应该可以使用Component Resizer

    【讨论】:

      【解决方案4】:

      这不是很好idea,当然可以将Image or ImageIcon作为背景,最好将JLabelIcon一起使用,然后你可以轻松painting selection

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2019-07-28
        • 2014-03-21
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多