позволяя пользователям рисовать и изменять размер JTextArea

Я хочу, чтобы пользователи могли «рисовать» с помощью мыши (щелкать и перетаскивать), чтобы создавать и изменять размер JTextArea. Кроме того, я хотел бы, чтобы текстовые области изменялись по размеру.

Что-то вроде этого:

введите здесь описание изображения

приходит на ум, но как JTextArea, а не просто квадрат.

Есть ли что-то в Java, что позволило бы мне легко это сделать? Сначала я подумал разрешить пользователю рисовать прямоугольник и просто захватить координаты и размер для создания JTextArea. Я не уверен, как сделать изменение размера, хотя.

Редактировать: «Изменение размера / изменение размера компонента» — это термин, который я искал, и я добавляю его здесь на случай, если кто-то еще ищет что-то подобное!


person matthieu    schedule 19.07.2011    source источник
comment
Я хочу, чтобы пользователи могли рисовать с помощью мыши (щелчок и перетаскивание), чтобы создать и изменить размер JTextArea. Это для графического редактора Drag'n'Drop Java? Таких на планете уже слишком много.   -  person Andrew Thompson    schedule 20.07.2011
comment
Это будет компонентом среды создания коллажей! Я хочу взглянуть на эти редакторы Drag'n'Drop, есть какие-нибудь любимые? Было бы интересно увидеть и не очень хороших!   -  person matthieu    schedule 20.07.2011
comment
Это будет компонент среды для создания коллажей! Ну, это было совершенно не то, о чем я думал! Создатели коллажей — прекрасное и достойное дополнение к «appliverse» (вселенной приложений — я придумал это на месте, можете ли вы сказать?) Я хочу взглянуть на эти редакторы Drag'n'Drop, есть ли какие-нибудь избранное? Нет. Нет. Было бы интересно увидеть и не очень хорошие! У Netbeans есть один, и есть плагины для Eclipse, AFAIU, хотя я сомневаюсь, что код любого из них будет очень полезен для того, что вам нужно. делают.   -  person Andrew Thompson    schedule 21.07.2011


Ответы (4)


Вы можете найти решение здесь. Я уже пробовал, и результат очень хороший. В руководстве есть ссылка на другую реализацию здесь.

person revo    schedule 19.07.2011

Изменение размера JTextArea можно достаточно легко выполнить, вызвав для него setBounds(...) -- или, что лучше, для JScrollPane, в котором он хранится, но вам нужно будет использовать нулевой или аналогичный макет (JLayeredPane) в контейнере, который содержит JTextArea и, вероятно, потребуется перекрасить контейнер после изменения размера JScrollPane. Вам также придется перепроверить область просмотра области прокрутки, чтобы она перераспределила текстовую область, которую она содержит.

e.g.,

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();
         }
      });
   }
}
person Hovercraft Full Of Eels    schedule 19.07.2011
comment
Спасибо! Это очень полезно, и это именно то, что я искал для рисования! - person matthieu; 21.07.2011

Вы должны иметь возможность использовать изменитель размера компонента.

person camickr    schedule 20.07.2011

это не очень хорошая идея, конечно, можно поставить Image или ImageIcon в качестве фона, лучше использовать для этого JLabel с Значок, то вы можете выбор картины легко

person mKorbel    schedule 19.07.2011