2014-01-24 6 views
1

Я знаю, что JViewport является контейнером с одним ребенком, а также я не могу добавить несколько компонентов в одну jscrollpane.Как сделать один JScrollPane подключенным к двум компонентам?, Обходное решение

Но могу ли я отслеживать положение прокрутки и в соответствии с этим изменять вид другого компонента? Чтобы показать, что им пытаются сделать здесь это изображение:

http://i.imgur.com/X9GW3VO.png

вот мой код:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.SystemColor; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.border.MatteBorder; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Utilities; 

public class XMLSettingsPage extends JPanel { 

    private int lines; 
    private LinePanel linePanel; 
    private JPanel southButtP; 
    private JButton saveBtn = new JButton("Save"); 
    private JButton resetBtn = new JButton("Reset"); 
    private JScrollPane jsp; 
    private JTextArea textArea; 
    private JPanel panel; 

    public XMLSettingsPage() { 

     setBackground(Color.BLACK); 
     setLayout(new BorderLayout()); 

     panel = new JPanel(); 
     add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BorderLayout(0, 0)); 

     linePanel = new LinePanel(); 
     panel.add(linePanel, BorderLayout.WEST); 
     linePanel.setForeground(Color.GRAY); 
     linePanel.setFont(new Font("Tahoma", Font.PLAIN, 13)); 
     linePanel.setBackground(SystemColor.inactiveCaptionBorder); 

     textArea = new JTextArea(); 
     textArea.setCaretColor(Color.BLACK); 
     textArea.setFont(new Font("Tahoma", Font.PLAIN, 13)); 
     textArea.setForeground(Color.BLACK); 
     textArea.setBackground(UIManager.getColor("menu")); 

     textArea.addKeyListener(new LinePanel() { 
      @Override 
      public void keyPressed(KeyEvent e) { 
       linePanel.setLine(getLines()); 

      } 
     }); 

     textArea.addFocusListener(new FocusListener() { 

      @Override 
      public void focusLost(FocusEvent e) { 
       southButtP.setVisible(false); 
      } 

      @Override 
      public void focusGained(FocusEvent e) { 
       southButtP.setVisible(true); 
      } 
     }); 

     LinePainter painter = new LinePainter(textArea); 
     painter.setColor(Color.WHITE); 

     jsp = new JScrollPane(textArea); 
     panel.add(jsp, BorderLayout.CENTER); 
     jsp.setBackground(Color.BLACK); 
     jsp.setBorder(null); 

     southButtP = new JPanel(); 
     add(southButtP, BorderLayout.SOUTH); 
     southButtP.setBorder(new MatteBorder(1, 0, 0, 0, (Color) Color.WHITE)); 
     southButtP.add(resetBtn); 
     southButtP.add(saveBtn); 
     southButtP.setBackground(SystemColor.scrollbar); 

     southButtP.setVisible(false); 

     resetBtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       reset(); 
      } 

     }); 
     resetBtn.setBackground(resetBtn.getParent().getBackground()); 
     saveBtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       save(); 

      } 
     }); 
     saveBtn.setBackground(resetBtn.getParent().getBackground()); 

    } 

    private int getLines() { 
     int totalCharacters = textArea.getText().length(); 
     int lineCount = (totalCharacters == 0) ? 1 : 0; 

     try { 
      int offset = totalCharacters; 
      while (offset > 0) { 
       offset = Utilities.getRowStart(textArea, offset) - 1; 
       lineCount++; 
      } 
     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
     return lineCount; 
    } 

    private void reset() { 
     textArea.setText(getXMLSettingsData()); 
    } 

    private void save() { 
     // write to xml file settings. 
    } 

    private String getXMLSettingsData() { 
     return null; 
    } 

    public static void setXMLSettingsData() { 
     // sets xml data on change 
    } 

} 

// Line Panel. 
class LinePanel extends JTextArea implements KeyListener { 

    private int lineNumber = 1; 
    private StringBuilder sb; 
    final private String END_STRING = " \n"; 

    public LinePanel() { 
     sb = new StringBuilder(); 
     setBackground(Color.BLACK); 
     setFont(new Font("Tahoma", Font.PLAIN, 13)); 
     setEditable(false); 

    } 

    public void printNumbers(String s) { 
     setText(s); 
    } 

    private void numberFactory(int l) { 

     sb.delete(0, sb.length()); 
     for (int i = 0, a = 1; i < l; i++, a++) { 
      sb.append(" " + a + END_STRING); 
     } 
     printNumbers(sb.toString()); 
    } 

    public void setLine(int line) { 
     if (lineNumber != line) { 
      lineNumber = line; 
      numberFactory(line); 

     } else { 
     } 
    } 

    public int getLine() { 
     return lineNumber; 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

} 

Когда я достигаю нижней части окна я не могу видеть еще номера строк по очевидной причине (его не прокручивается автоматически или вручную).

Есть ли способ подключить JScrollPane к востоку JTextArea, чтобы я мог видеть номера каждой строки даже после того, как я дошел до нижней панели?

И если вы знаете лучший способ сделать это, пожалуйста, дайте мне знать, что я открыт для любых идей.

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

+0

Поместите оба компонента в одной панели, добавьте одну панель прокрутки-панели. –

ответ

3

Используйте вид rowHeader.

enter image description here

jsp.setRowHeaderView(textArea); 
+0

Попытка этого и вернуться с моими результатами –

+0

Это сумасшедшие 2 строки кода, и все работает !!! Спасибо, хорошее решение примет ответ, когда я смогу. –

+1

К счастью разработчики java swing сделали хорошую работу. :) –

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

  • Нет связанных вопросов^_^