如何以递归方式禁用JPanel中的所有组件?
我目前正在替换我的匿名ActionListeners
new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
使用表示操作的类文件:
public class xxxxxxxAction extends AbstractAction {
}
Run Code Online (Sandbox Code Playgroud)
但是,我的GUI能够执行很多操作(例如CreatePersonAction,RenamePersonAction,DeletePersonAction,SwapPeopleAction等).
有没有一种很好的方法将这些类组织成一个连贯的结构?
我正在回答Haskell的99个问题中的第七个问题.但是,我已经到了他们定义类型的地步
data NestedList a = Elem a | List [NestedList a]
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它不会处理空列表(即.[]).
但是在他们的示例测试中他们表明了
*Main> flatten (List [])
[]
Run Code Online (Sandbox Code Playgroud)
这种类型是否包含空列表?如果是这样,为什么?
如果没有,并且是网站的错误,那么如何编写处理空列表的嵌套列表类型?
我目前正在使用Haskell的OpenGL绑定编写基本的渲染演示.问题是它几乎不能处理2000多个顶点.我的伪代码相当于:
terrain = The set of points generated from [-1...1] x [-1...1] x [-1...1].
camera = Camera at position (xc, yc) with angles (ax, ay, az).
while running:
input = anything that moves the camera's position or angles
projected = []
for point in terrain:
projected.append(camera.perspectiveProjection(point))
renderPoints(projected)
Run Code Online (Sandbox Code Playgroud)
问题(我相信)是我手动将每个三维点转换为二维,然后使用OpenGL绘制这些点.
我的问题是:我应该提供OpenGL三维点,然后使用OpenGL烘焙过的任何投影吗?
(我觉得我理解透视投影是如何工作的 - 我只是不确定我是否应该手动执行此操作.)
编辑:
以下是我的代码.我已经省略了我认为只有函数定义才能解释清楚的部分.
main :: IO()
main = do
(_progName, _args) <- getArgsAndInitialize
initialDisplayMode $= [DoubleBuffered]
_window <- createWindow "Hello, World"
-- The camera position followed by pitch, yaw …Run Code Online (Sandbox Code Playgroud) 我试图实现以下算法,详见此处.
从平坦地形开始(将所有高度值初始化为零).
选择地形上或附近的随机点,以及某个预定最小值和最大值之间的随机半径.仔细选择这个最小值和最大值将使地形变得粗糙,岩石或平滑和滚动.
在具有给定半径的点上居中的地形上升起山丘.
返回步骤2,根据需要重复多次.选择的迭代次数将影响地形的外观.
然而,一旦我到达必须在地形上选择随机点的点,我就开始挣扎.这个随机点包含在IO monad中,然后传递给我的函数链.
我可以IO在某一点切断,如果是这样,我该如何找到这一点?
以下是我的(破损)代码.我将不胜感激任何关于改进/阻止随机性感染一切的建议.
type Point = (GLfloat, GLfloat, GLfloat)
type Terrain = [Point]
flatTerrain :: Double -> Double -> Double -> Double -> Terrain
flatTerrain width length height spacing =
[(realToFrac x, realToFrac y, realToFrac z)
| x <- [-width,-1+spacing..width], y <- [height], z <- [-length,-1+spacing..length]]
hill :: Terrain -> Terrain
hill terrain = hill' terrain 100
where hill' terrain 0 = terrain
hill' terrain iterations = do
raised <- …Run Code Online (Sandbox Code Playgroud) 我在Haskell中编写了一个使用查找表的程序.
例如.
type Table = [(Object, FilePath)]
data Object = Player { pName :: String }
Run Code Online (Sandbox Code Playgroud)
我想以一种Player可以成为查找键的方式构造它:
[(Player, "data/players"), ...]
Run Code Online (Sandbox Code Playgroud)
如果我添加了另一种Object类型Monster,我的表可能如下所示:
[(Player, "data/players"), (Monster, "data/mons"), ...]
Run Code Online (Sandbox Code Playgroud)
但是,我的a类型定义Table表明我正在查找实例化对象,实际上,我只是想检查它是否是一个类型构造函数或另一个.
我该怎么做呢?
编辑:
我想我想要这样的东西:
data ObjectType = Player | Monster | ...
Run Code Online (Sandbox Code Playgroud)
但有没有办法避免重复数据构造函数和类型构造函数?
我在Haskell中有以下代码:
move :: Camera -> (Double, Double, Double) -> Camera
move camera (xt, yt, zt) = camera { cPosition = (x + xt, y + yt, z + zt) }
where (x, y, z) = cPosition camera
moveForward :: Camera -> Camera
moveForward camera = move camera (-1 * sin ya, 0, -1 * cos ya)
where (_, ya, _) = cRotation camera
moveBackward :: Camera -> Camera
moveBackward camera = move camera (sin ya, 0, cos ya)
where (_, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个具有类型安全长度的矢量库,这意味着添加两个不同长度的矢量将无法飞行.
我目前的实施大致是:
data Natural where
Zero :: Natural
Succ :: Natural -> Natural
type One = Succ Zero
type Two = Succ One
type Three = Succ Two
type Four = Succ Three
data Vector n e where
Nil :: Vector Zero e
(:|) :: e -> Vector n e -> Vector (Succ n) e
infixr :|
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试实现,zipWith因为它将有助于实现dot产品和Num类型类之类的东西.
我已经走到了这一步
zipWith :: (a -> b -> c) -> Vector n a -> Vector n b …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Haskell创建一个简单的服务器.当客户端连接到服务器时,服务器会记录其地址.每n微秒,服务器发送一个广播.
这是服务器
data Server = Server {
sSocket :: Socket,
sPort :: Port,
sClients :: MVar [ClientAddress]
}
Run Code Online (Sandbox Code Playgroud)
(注意允许从多个线程使用客户端的MVar.)
这就是服务器的创建方式
startServer port = withSocketsDo $ do
socket <- listenOn $ PortNumber $ fromIntegral port
clients <- newEmptyMVar
let server = Server socket port clients
forkIO $ forever $ accept socket >>= forkIO . (handleClientRequest server)
forever $ updateClients server 1000000
Run Code Online (Sandbox Code Playgroud)
服务器使用其线程并分叉.分叉线程处理任何传入的客户端请求
handleClientRequest server client = do
clients <- takeMVar $ sClients server
putMVar (sClients server) (client : clients) …Run Code Online (Sandbox Code Playgroud) Java是否提供了一种方法来执行类似下面的操作,而无需在单独的变量中声明数组?
for (String s : {"HEY", "THERE"}) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的是:
for (String s : new ArrayList<String>() {{ add("HEY"); add("THERE"); }}) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这不漂亮.