2014-04-01 86 views
0

想要擁有一個JTextPane,其內容始終可以由用戶選擇。因此,我創建了自己的JTextPane的子類,並始終在方法「isEnabled()」中返回true。另外我介紹一個新成員m_enabled,它負責返回正確的前景色(啓用/禁用)。JTextPane和前景色

它按預期工作,但如果我設置了默認的前景色(例如Color.RED)並在啓用和禁用之間切換,則前景色不再是紅色。

你能幫我解決這個問題嗎?

public class StylesExample1 { 
public static final String text = "Lorem ipsum dolor..."; 
public static boolean m_enabled = true; 

public static void main(String[] args) throws BadLocationException { 
    try { 
     UIManager 
       .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    } catch (Exception evt) { 
    } 

    JFrame f = new JFrame("Frame"); 
    final JTextPane pane = new MyPane(); 
    pane.setText(text); 

    pane.setPreferredSize(new Dimension(200, 200)); 
    f.getContentPane().add(pane); 
    JButton b = new JButton("Toggle Enabled state"); 
    b.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      m_enabled = !m_enabled; 
      System.err.println("setting textpane enabled to " + m_enabled); 
      pane.setEnabled(m_enabled); 
     } 
    }); 

    pane.setForeground(Color.red); 

    f.getContentPane().add(b); 
    f.getContentPane().setLayout(new FlowLayout()); 
    f.setSize(400, 300); 
    f.setVisible(true); 
} 
} 

class MyPane extends JTextPane { 

private static final long serialVersionUID = 1L; 
private boolean m_enabled = true; 
private Color defaultForegroundColor, disabledTextColor; 

public MyPane() { 
    defaultForegroundColor = getForeground(); 
    disabledTextColor = getDisabledTextColor(); 
} 

public void setEnabled(boolean enabled) { 
    m_enabled = enabled; 

    if (m_enabled) { 
     setForeground(defaultForegroundColor); 
    } else { 
     setForeground(disabledTextColor); 
    } 
} 

@Override 
public boolean isEnabled() { 
    return true; 
} 
} 

回答

0

在你的構造爲「MyPane」,你設置的默認前景色爲的JTextPane默認的前景,但隨後的構造後,你調用setForeground(Color.red)。問題是MyPane中的「defaultForegroundColor」成員並不知道它是紅色的。做以下調整:

public MyPane(Color defaultForegroundColor) 
{ 
    this.defaultForegroundColor = defaultForegroundColor; 
    this.disabledTextColor = getDisabledTextColor(); 
} 

,並使用下面的代碼創建它:如果你想改變施工後的前景

final JTextPane pane = new MyPane(Color.red); 

,請執行下列操作:

public void setNewForeground(Color c) 
{ 
    this.defaultForegroundColor = c; 
} 
+0

,但如果我想改變構造後的前景色了所謂? – matthias

+0

我已經修改了相應的答案 – Fallso

2
  • 您的班級MyPane extends JTextPane不會覆蓋所需的具體細節和正確的方法,

  • 有可能是另一個問題與DeafultHightLigter/Painter/Caret/Selection

  • (我建議)的使用和從UIManager by @camickr

在UIManager的覆蓋密鑰 Windows(Classic)LookAndFeel

  • 鍵的編輯列表

    enter image description here

    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.FlowLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JTextPane; 
    import javax.swing.SwingUtilities; 
    import javax.swing.UIManager; 
    import javax.swing.text.BadLocationException; 
    
    public class StylesExample1 { 
    
        private final String text = "Lorem ipsum dolor..."; 
        private boolean m_enabled = true; 
    
        public StylesExample1() { 
         final JTextPane pane = new MyPane(); 
         pane.setText(text); 
         pane.setPreferredSize(new Dimension(200, 200)); 
         JButton b = new JButton("Toggle Enabled state"); 
         b.addActionListener(new ActionListener() { 
          @Override 
          public void actionPerformed(ActionEvent e) { 
           m_enabled = !m_enabled; 
           System.err.println("setting textpane enabled to " + m_enabled); 
           pane.setEnabled(m_enabled); 
          } 
         }); 
         pane.setDisabledTextColor(Color.red); 
         pane.setForeground(Color.red); 
         JFrame f = new JFrame("Frame"); 
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         f.getContentPane().add(pane); 
         f.add(b); 
         f.getContentPane().setLayout(new FlowLayout()); 
         f.setSize(400, 300); 
         f.setVisible(true); 
        } 
    
        public static void main(String[] args) throws BadLocationException { 
         try { 
          UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
         } catch (Exception evt) { 
         } 
         javax.swing.SwingUtilities.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
           new StylesExample1(); 
          } 
         }); 
        } 
    } 
    
    class MyPane extends JTextPane { 
    
        private static final long serialVersionUID = 1L; 
        private boolean m_enabled = true; 
        private Color defaultForegroundColor, disabledTextColor; 
    
        public MyPane() { 
         defaultForegroundColor = getForeground(); 
         disabledTextColor = getDisabledTextColor(); 
        } 
    
        @Override 
        public void setEnabled(boolean enabled) { 
         m_enabled = enabled; 
         if (m_enabled) { 
          UIManager.put("TextPane.disabledBackground", Color.RED); 
          UIManager.put("TextPane.foreground", Color.RED); 
          UIManager.put("TextPane.inactiveForeground", Color.RED); 
          SwingUtilities.updateComponentTreeUI(this); // don't to use this 
         } else { 
          UIManager.put("TextPane.disabledBackground", Color.RED); 
          UIManager.put("TextPane.foreground", Color.RED); 
          UIManager.put("TextPane.inactiveForeground", Color.RED); 
          SwingUtilities.updateComponentTreeUI(this); // don't to use this 
         } 
        } 
    
        @Override 
        public boolean isEnabled() { 
         return true; 
        } 
    } 
    
  • +0

    在我的用例中,我需要在之後更改背景顏色。所以我不想硬編碼紅色。應該可以稍後調整 – matthias

    +0

    你可以通過任何(有效值)Color來代替Color.RED,簡單的你可以使用defaultForegroundColor/disabledTextColor,通過構造函數或者作爲硬編碼常量(enum)在局部變量中初始化,並使用私有變量,現在你的問題是關於/只有如何從另一個類傳遞值(每天在Swing中提問) – mKorbel

    0

    想要有一個JTextPane,其內容總是可以由用戶選擇。

    然後我會用:中

    setEditable(false); 
    

    代替

    setEnabled(false);