java swing의 jtable에서 keylistener을 제거할 수 없나요?

이한길의 이미지

java swing의 jtable을 사용하려고 하는데..
keylistener를 등록해서 copy,paste,redo,undo 등을 구현하려고합니다.

그래서 keylistener를 등록해서 Ctrl+C를 누르면 copy를 처리하게 했는데
그 처리를 한 후에 jtable이 임의로 클립보드에 다른 데이터를 다시..
집어 넣어서 이미 제가 처리해서 클립보드에 넣은 내용은 지워집니다.

그 외에도 redo,undo의 경우에도..
jtable에 기본적인 작업이 있는지 제가 정의한 작업 외에도..
더 작업을 하는 것 같습니다.

혹시 이러한 작업들을 제거할 수 없나요?

dormael의 이미지

제가 swing이나 jtable, 클립보드에 경험이 전무한 관계로 큰 도움을 드릴수는 없지만 우선 클립보드관련 api와 jtable관련 api를 잘 살펴보셔야 할 것 같습니다.

jtable이 단순한 컴포넌트가 아니라 해결 방법이 다른곳에 있을수도 있겠더군요.

그냥 단순하게 생각하면 jtable의 키이벤트나 클립보드 관련 이벤트 처리 메소드를 상속받아 재정의 하면 될것 같긴 하지만 대강 봐서는 그럴만한게 안보이네요.

적어놓고 보니 도움이 될만한 내용이 하나도 없네요. ㅡ,.ㅡ

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

HotPotato의 이미지

그런데, 기존 JTable에서도 Ctrl+C, Ctrl+V가 가능하지 않나요?
Table Row 전체복사는 안해봤지만, 각각의 Column별 복사는 가능합니다.
단, 더블클릭으로 Column내 텍스트를 선택했을 때의 얘기지요.

--
forum.java.sun.com을 추천합니다.

--
즐 Tux~

exsider의 이미지

addXXXListener 메소드가 있는 위젯에는 removeXXXListener 메소드와 getXXXListeners 메소드가 있습니다.
일단 removeXXXListener 로 모든 리스너를 삭제한 다음 필요한 리스너만 다시 등록하면 되지 않을까요???

이한길의 이미지

관심을 갖고 댓글을 주셔서 고맙습니다.

Quote:
일단 removeXXXListener 로 모든 리스너를 삭제한 다음 필요한 리스너만 다시 등록하면 되지 않을까요???

일단 JTable에서 getKeyListeners를 해서 가져와보면 .. 리스너는 제가 등록하기 전까지는 하나도 없습니다. 다른데에 있지 않나 싶은데 아직까지 못찼았습니다.

Quote:
그런데, 기존 JTable에서도 Ctrl+C, Ctrl+V가 가능하지 않나요?

물론 됩니다. 그게 문제라는 것이지요. Ctrl+C를 누를때 제가 지정한 기능만 수행하고 이미 가능하게 구현된 기능이 수행되지 않게 하려는 것입니다. 이유는 Ctrl+C를 누르면 먼저 JTable에 등록된 KeyListener가 호출되어 제가 정의한 기능이 수행이 되고 여기서 멈추는 것이 아니라 기존에 구현된 기능이 다음에 수행이 되기 때문에 제가 정의한 기능으로 만들어진 클립보드 데이터가 덮어써져버립니다.

Quote:
jtable이 단순한 컴포넌트가 아니라 해결 방법이 다른곳에 있을수도 있겠더군요.

정말 단순한 컴포넌트가 아니어서 가끔은 정말 잘 구성해놓았구나 싶다가도 어쩔때는 무엇인가를 찾기가 힘들어서 헤메기도합니다.. 일단 JTable과 Clipboard클래스들에 대해서는 나름대로 자세히 살펴봤는데 이 부분에 대해 답이 나오지 않네요..

사실 후에 클립보드를 덮어쓰는것을 이전에 클립보드에 등록할때 알아채서 그것을 막을 수 있는 방법이 있긴 합니다. 하지만 이렇게 하는것은 조금 억지를 부리는듯하고 Ctrl+C와 같은 기능키 외에 다른것들에서는 마땅히 해결책이 없기 때문에 근본적인 해결책을 찾고 싶습니다.
----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.xo.st
http://hangulee.egloos.com/

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

dormael의 이미지

정확히 어떤 상황에서 cpoy&paste를 하셨는지 궁금합니다.

jtable의 경우 여러 모델이나 컴포넌트들의 조합으로 만들어 지기 때문에 키에 대한 액션을 jtable이 아닌 이것들이 처리했을 가능성도 있어서요.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

이한길의 이미지

정확히 한 행(row)를 선택하고, 또는 그 이상의 행을 선택하고 수행했습니다.
Paste는 직접 JTABLE에 해보지 않았고 java에서 클립보드 데이터를 얻어다가..
콘솔에 뿌려보기만 했습니다.

콘솔에 뿌려보니 내용이 선택했던 행에 대한 것들이 여러 형태로
클립보드에 들어가 있음을 알 수 있었습니다.

결과적으로 제가 Ctrl+C를 누르면 클립보드로 카피하게 해 놓은 내용이
그 후에 jtable에 의해 덮여버리는 것을 알게 되었습니다.

또한 이게 확실한 이유는 자바에서 클립보드에 내용을 집어 넣을때..
그 내용이 덮어씌여질때 알려주는 클래스를 등록하게 되어 있는데..
그걸 등록해서 덮여씌여질때 확인해보면 덮여 씌여지면서 지워진다고 통보된
클립보드 내용이 바로 전에 Ctrl+C를 누를때 클립보드에 넣은 내용이기 때문입니다.

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.xo.st
http://hangulee.egloos.com/

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

dormael의 이미지

문제는 해결하셨는지 모르겠네요..

제가 정확히 본건지 모르겠는데 swing component의 경우 Listener뿐 아니라 InputMap, ActionMap, Action같은 것들이 있네요. 혹시 이쪽에 해결 방안이 있지 않을까요?

Quote:

As for all JComponent classes, you can use InputMap and ActionMap to associate an Action object with a KeyStroke and execute the action under specified conditions.

직접 해볼 시간이 없어서 api만 보고 말씀드리는 거라 정확하진 않지만 위의 부분이나 Clipboard쪽에 방법이 제시되어 있을 가능성이 큽니다. 간단한 소스라면 올려주시면 테스트라도 해볼 수 있을텐데요. ^^

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

이한길의 이미지

소스가 간단하지는 않습니다.

어떻게 되었든 앞에서 잠깐 언급했던 방법으로 지금은 대충 때우고 있습니다.

ClipboardOwner 인터페이스를 구현하면서 ...
전에 썼던것을 덮어쓰려고 한다면 그것을 막아주는 것입니다.
막아준다기보다는 이미 덮어씌여진곳에 다시 그것으로 덮어써버리는것이지요.

조금 찝찝하지만 일단 하고싶은대로는 됩니다.
하지만 근본적인 해결책을 찾았으면 좋겠습니다.

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.xo.st
http://hangulee.egloos.com/

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.