2014-10-15 3 views
3

Я хочу установить пользовательское фоновое изображение на JTextArea. Я смотрел в google, но без результата, фон мог быть логотипом, также я хочу знать, как установить разрешение фона.Как установить фоновое изображение на JTextArea в JPanel

У меня есть только один класс в пакете. У меня есть драйвер соединителя MySQL в качестве Реферировано библиотек, мой верстак является затмение, экспорт банки с Fat-банкой плагиным

Код:

public class panel extends JPanel implements ActionListener { 
    protected JTextField textField, textField2; 
    protected static JTextArea textArea; 
    private final static String newline = "\n"; 

    public panel() { 
     super(new GridBagLayout()); 
     textField = new JTextField(30); 
     textField.addActionListener(this); 
     textField.setBackground(Color.LIGHT_GRAY); 

     textField2 = new JTextField(30); 
     textField2.addActionListener(this); 
     textField2.setEnabled(false); 



     textArea = new JTextArea(30, 100); 
     textArea.setEditable(false); 
     JScrollPane scrollPane = new JScrollPane(textArea); 

     //Add Components to this panel. 
     GridBagConstraints c = new GridBagConstraints(); 
     c.gridwidth = GridBagConstraints.REMAINDER; 

     c.fill = GridBagConstraints.HORIZONTAL; 
     add(textField, c); 
     add(textField2, c); 

     c.fill = GridBagConstraints.BOTH; 
     c.weightx = 1.0; 
     c.weighty = 1.0; 
     add(scrollPane, c); 
    } 

    public void actionPerformed(ActionEvent evt) { 
     String select = textField.getText(); 
     if(textField.getText().equalsIgnoreCase("connect")){ 
      textArea.setForeground(Color.BLACK); 
      connect(); 
      textField.setText(""); 
     }else if(textField.getText().equalsIgnoreCase("select test")){ 
      textArea.setForeground(Color.BLACK); 
      viewTest(); 
      textField.setText("");; 
     }else if(textField.getText().equalsIgnoreCase("clear")){ 
      textArea.setForeground(Color.BLACK); 
      textField.setText(""); 
      clear(); 
     }else if(textField.getText().equalsIgnoreCase("commands")){ 
      textArea.setForeground(Color.BLACK); 
      commandsmenu(); 
      textField.setText(""); 
     }else if(textField.getText().equalsIgnoreCase("insertinto test")){ 
      textField2.setEnabled(true); 
      if(textField2.getText().equals("")){ 

      textArea.append("Please add the VALUES of the table on the second textfield! Syntax: 'Agevaulue', namevalue, adressvalue !" + newline); 
      }else{ 

       textArea.setForeground(Color.BLACK); 
       InsertIntoTest(); 
       textField2.setText(""); 
       textField2.setEnabled(false); 
      } 

     } 



     else { 
      clear(); 
      textArea.setForeground(Color.RED); 
      textArea.append("Uknown Command -- use: commands -- to see all commands!"); 
      textField.selectAll(); 
     } 

     //Make sure the new text is visible, even if there 
     //was a selection in the text area. 
     textArea.setCaretPosition(textArea.getDocument().getLength()); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event dispatch thread. 
    */ 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("Java + MySQL Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Add contents to the window. 
     frame.add(new panel()); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public void connect(){ 
     Connection conn = null; 
     try 
     { 
      String url = "jdbc:mysql://localhost/users"; 

      Class.forName("com.mysql.jdbc.Driver"); 
      textArea.append("Database connection established"); 
      conn = DriverManager.getConnection(url, "root", "kristian76"); 

     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    public void viewTest() 
      { 
      Connection conn = null; 
      try{ 
      String url = "jdbc:mysql://localhost/users"; 

      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection(url, "root", "kristian76"); 

      String query = "SELECT * FROM test"; 
      Statement stmt = conn.createStatement(); 
      ResultSet rs = stmt.executeQuery(query); 
      while (rs.next()){ 
       int age = rs.getInt("age"); 
       String name = rs.getString("name"); 
       String adress = rs.getString("adress"); 
       textArea.append("AGE: " + age + " |Name: " + name + " |Adress: " + adress + newline); 
      } 
      }catch(Exception e){ 
       textArea.setForeground(Color.RED); 
       textArea.append("Got an Exception!" + newline); 
       textArea.append(e.getMessage()); 
      } 
      }public void InsertIntoTest() { 
       Connection conn = null; 
       try{ 
        String url = "jdbc:mysql://localhost/users"; 
        Class.forName("com.mysql.jdbc.Driver"); 
        conn = DriverManager.getConnection(url, "root", "kristian76"); 

        String query = "INSERT INTO test(age, name, adress)VALUES(" + textField2.getText() + ")"; 
        Statement stmt = conn.createStatement(); 
        stmt.executeUpdate("INSERT INTO test(age, name, adress)VALUES(" + textField2.getText() + ")"); 
        textArea.append("Data Imported!" + newline); 
       }catch(Exception e){ 
        textArea.setForeground(Color.RED); 
        textArea.append("Got an Exception" + newline); 
        textArea.append(e.getMessage()); 

       } 
      } 
    public void clear(){ 
     textArea.setText(""); 
    } 
    public void commandsmenu() { 
     textArea.append("select <table> - read a <table>" + newline); 
     textArea.append("clear - clear output" + newline); 
     textArea.append("commands - see Commands" + newline); 
     textArea.append("insertinto <table> - insert data into <table>" + newline); 

    } 

    public static void main(String[] args) { 
     //Schedule a job for the event dispatch thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+1

Можете добавить свой код, пожалуйста? – Stephan

+0

см. Это сообщение, может быть, поможет вам http://stackoverflow.com/questions/8462414/internal-padding-for-jtextarea-with-background-image – esprittn

+0

нет, это границы, у меня нет фонового изображения, например.если я пишу портал сервера Counter-Strike в качестве примера, если нет связи, я хочу, чтобы фон был желтым треугольником ... – BGdeveloper

ответ

3

Это очень просто, нужно просто создать свой собственный класс TextArea который простирается от JTextArea, а затем переопределить метод paintComponent включить фоновое изображение, вот класс:

public class MyTextArea extends JTextArea { 

    private Image img; 

    public MyTextArea(int a, int b) { 
     super(a,b); 
     try{ 
      img = ImageIO.read(new File("background.jpg")); 
     } catch(IOException e) { 
      System.out.println(e.toString()); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     g.drawImage(img,0,0,null); 
     super.paintComponent(g); 
    } 
} 

затем в панели вы все еще можете использовать тип JTextArea в коде:

protected static JTextArea textArea; 

Но при инициализации вызвать конструктор вашего недавно созданного класса:

textArea = new MyTextArea(30, 100); 

Подобно этому, текст не позволит вам увидеть изображение в фоновом режиме, так что мы должны сделать его прозрачным:

textArea.setBackground(new Color(1,1,1, (float) 0.01)); 

Я не видел код в деталях, но хорошая практика программирования является CamelCase имени класса, но так как «Panel» является ключевым словом Java (панель является AWT компонент), то вы можете назвать его чем-то вроде MyPanel или SQLPanel.

+2

Поскольку текст окрашен как часть вызова super.paintComponent, тогда это будет рисовать изображение по тексту. Кроме того, paintComponent никогда не должен быть общедоступным, и JComponent может действовать как ImageObserver для вызова drawImage – MadProgrammer

+0

Вы правы MadProgrammer, спасибо за исправления, я исправил модификатор доступа к коду paintComponent, упорядочил порядок предложений , но я не понял об ImageObserver, я буду читать об этом. Я также заметил, что текст перекрывает изображение, поэтому я добавил прозрачный фон, чтобы изображение было видимым. –

+2

Если компоненты не прозрачны, то 1- Он будет рисовать цвет фона по умолчанию по изображению и 2- Он может рисовать проблемы, так как Swing знает, как работать с полностью непрозрачными или полностью прозрачными компонентами ... – MadProgrammer

1

Это не сложно, если вы используете HTML. Ваш код может выглядеть следующим образом:

textPane = new JTextPane(30, 100); 
textPane.setEditable(false); 

// load image 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
FileInputStream in = new FileInputStream("/path/to/your/image.png"); 
byte[] buf = new byte[4096]; int read; 
while ((read = in.read(buf)) != -1) 
    out.write(buf, 0, read); 
in.close(); 

// set image 
textPane.setContentType("text/html"); 
textPane.setText("<html><head><style type=\"text/css\"> body {" 
    + "background-image: url(data:image/png;base64," 
    + Base64.getEncoder().encodeToString(out.toByteArray()) 
    + "); } </style></head><body>ENTER YOUR TEXT HERE</body></html>"); 
+0

A JTextArea doesn ' t поддержка HTML. – camickr

+0

@camickr Извините, это должно быть 'JTextPane', спасибо – msrd0

2

Первая мысль, возможно, придется это нарисовать изображение в paintComponent методе текстовой области, в то время как это может показаться на работу, как только вы начинаете пытаться набирать текст, я найду, что, как предполагается, является фоновым изображением, на самом деле представляет собой изображение переднего плана и рисует текст.

Хорошо, таким образом, вы могли бы нарисовать изображение первого, а затем вызвать super.paintComponent после него, но цвет фона фактически окрашены как часть paintComponent вызова ...

Что вам нужно сделать, это трюк компонент не окрашивает цвет фона. Самым простым решением было бы сделать компонент прозрачным, например ...

public class CustomTextArea extends JTextArea { 

    private BufferedImage image; 

    public CustomTextArea() { 
     super(20, 20); 
     setOpaque(false); 
     try { 
      image = ImageIO.read(new File("...")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(getBackground()); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     if (image != null) { 
      int x = getWidth() - image.getWidth(); 
      int y = getHeight() - image.getHeight(); 
      g2d.drawImage(image, x, y, this);  
     } 
     super.paintComponent(g2d); 
     g2d.dispose(); 
    } 

} 

Это основано на этом Inserting an image under a JTextArea ответ

Другим вариантом было бы сделать изображение внутри ScrollPane, это дает вам варианты о том, как вы хотите управлять прокруткой изображения (с компонентом или липкой), например см. Add background image in JTable

Смежные вопросы