2014-03-31 3 views
0

사용자가 항상 내용을 선택할 수있는 JTextPane을 갖고 싶습니다. 따라서 나는 JTextPane의 자체 하위 클래스를 만들고 "isEnabled()"메서드에서 항상 true를 반환합니다. 또한 나는 새로운 멤버가 올바른 전경색을 반환 할 책임이있는 m_enabled 도입 문제는 현재 전경색은 변경되지 않는다는 것입니다JTextPane이 올바른 전경색을 표시하지 않음

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); 
     } 
    }); 
    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; 

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

@Override 
public Color getForeground() { 
    if (m_enabled) { 
     System.err.println("foreground color: " + super.getForeground()); 
     return super.getForeground(); 
    } else { 
     System.err.println("foreground color: " + getDisabledTextColor()); 
     return getDisabledTextColor(); 
    } 
} 

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

(비활성화/활성화). 텍스트 팬이 비활성화되어있을 때마다 항상 표시됩니다. 그러나 "getForeground에"의 디버그 정보는 말하는

setting textpane enabled to true 
foreground color: javax.swing.plaf.ColorUIResource[r=0,g=0,b=0] 
setting textpane enabled to false 
foreground color: javax.swing.plaf.ColorUIResource[r=109,g=109,b=109] 

이 나에게 좋아 보이지만, 어떤 아이디어를 가지고 마십시오 textpane 항상 enter image description here

을 달 수 보이는 다음?

+0

클릭 버튼을 세 번 시도 할 수 당신은 발견 할 것이다 그것은'전경색 : javax.swing.plaf.ColorUIResource [R = 109, G = 109, B = 109] '에 대한 모든 후속 클릭. – Braj

답변

1

super.getForeground()은 비활성화 된 색상으로 설정하면 슈퍼 클래스로 전파되기 때문에 다음 호출에서 비활성화 된 색상을 반환합니다. 아래와 같이 :

여기

코드는 getForeground에를() 메소드 만 setForeground 등() 메서드를 호출 폼 setEn 오버라이드 (override) 할 필요가 JComponent

public void setForeground(Color fg) { 
    Color oldFg = getForeground(); 
super.setForeground(fg); 
if ((oldFg != null) ? !oldFg.equals(fg) : ((fg != null) && !fg.equals(oldFg))) { 
    // foreground already bound in AWT1.2 
    repaint(); 
} 
} 

에서 직접 없습니다 abled() 메소드.

업데이트하기 전에 기본 전경색을 어딘가에 저장하고 추후 통화에 사용하십시오.

당신이 하나

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

repaint() 전화가 누락 된 것 같습니다. ActionListener. 사용할 수있는 MyPane 클래스의 코드가 없으므로 더 이상 알 수 없습니다.

관련 문제